blob: c3477616cdf879472fd40ac97fa5b54df2bcbce3 [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 Pedrol518e82f2021-11-12 17:24:33 +01001987 /* We may already receive idle blocks before our own TTCN3 timer
1988 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
1989 [mp_osmo_pcu_newer_than_0_9_0 and N3105 == N3105_MAX] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001990 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001991 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001992 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001993 * above case before continuing (expect empty blocks on new
1994 * versions, Dummy block on older versions): */
1995 if (mp_osmo_pcu_newer_than_0_9_0) {
1996 dl_block_exp := omit;
1997 } else {
1998 dl_block_exp := tr_RLCMAC_DUMMY_CTRL;
1999 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002000 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2001 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002002 dl_block_exp));
2003 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002004 [] BTS.receive {
2005 setverdict(fail, "Unexpected BTS message");
2006 f_shutdown(__BFILE__, __LINE__);
2007 }
2008 }
2009
2010 /* after T_3195 timeout, TBF is released */
2011 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2012 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2013
2014 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2015 f_sleep(X2002);
2016 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2017
2018 /* ACK the DL block */
2019 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2020 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2021 f_dl_block_ack_fn(dl_block, dl_fn));
2022
2023 f_shutdown(__BFILE__, __LINE__, final := true);
2024}
2025
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002026/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2027testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002028 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002029 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002030 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002031 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002032
2033 /* Initialize NS/BSSGP side */
2034 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002035 /* Initialize GPRS MS side */
2036 f_init_gprs_ms();
2037 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002038
2039 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002040 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002041
2042 /* Establish BSSGP connection to the PCU */
2043 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002044 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002045
2046 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002047 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002048
2049 /* Send one UL block (with TLLI since we are in One-Phase Access
2050 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002051 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002052 /* 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 +02002053 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 +02002054 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2055 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002056 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002057
2058 /* Send enough blocks to test whole procedure: Until Nth block
2059 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2060 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002061 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002062 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2063 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002064 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002065
2066 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002067 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 +07002068
2069 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002070}
2071
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002072/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2073testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2074 var RlcmacDlBlock dl_block;
2075 var uint32_t dl_fn, sched_fn;
2076 var octetstring payload;
2077 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002078 var template (value) LlcBlockHdr blk_hdr;
2079 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002080 var integer blk_len;
2081 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002082 var GprsMS ms;
2083
2084 /* Initialize NS/BSSGP side */
2085 f_init_bssgp();
2086 /* Initialize GPRS MS side */
2087 f_init_gprs_ms();
2088 ms := g_ms[0]; /* We only use first MS in this test */
2089
2090 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002091 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002092
2093 /* Establish BSSGP connection to the PCU */
2094 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002095 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002096
2097 /* Establish an Uplink TBF */
2098 f_ms_establish_ul_tbf(ms);
2099
2100 /* Send one UL block (with TLLI since we are in One-Phase Access
2101 contention resoultion) and make sure it is ACKED fine. */
2102 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002103 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2104 more := false, e := true);
2105 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002106 /* 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 +01002107 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2108 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002109 cv := 15,
2110 bsn := ms.ul_tbf.bsn,
2111 blocks := blocks,
2112 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002113 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002114 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002115
2116 /* ACK and check it was received fine */
2117 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2118 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2119 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2120 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002121 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 +02002122
2123 /* Test sending LLC PDUS of incrementing size */
2124 var integer max_size := 49;
2125 for (var integer i := 1; i <= max_size; i := i + 1) {
2126 var integer cv;
2127 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2128 log("Sending DATA.ind with LLC payload size ", i);
2129 if (i < max_size - g_bs_cv_max) {
2130 cv := 15;
2131 } else {
2132 cv := max_size - i;
2133 }
2134
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002135 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2136 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002137 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002138 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2139 more := false, e := true);
2140 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002141 /* 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 +01002142 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2143 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002144 cv := cv,
2145 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002146 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002147 f_ultbf_inc_bsn(ms.ul_tbf);
2148 f_ms_tx_ul_block(ms, ul_data);
2149
2150 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002151 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 +02002152
2153 /* we will receive UL ACK/NACK from time to time, handle it. */
2154 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2155 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2156 continue;
2157 }
2158 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2159 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2160 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2161 f_shutdown(__BFILE__, __LINE__);
2162 }
2163
2164 log("Rx Packet Uplink ACK / NACK");
2165 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2166 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2167 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2168 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002169
2170 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002171}
2172
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002173function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2174 var octetstring payload;
2175 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002176 var template (value) LlcBlockHdr blk_hdr;
2177 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002178 var integer block_len, max_valid_data_len;
2179 timer T;
2180
2181 block_len := f_rlcmac_cs_mcs2block_len(cs);
2182 /* We need to send with TLLI since we are in One-Phase Access Contenion
2183 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2184 * indicator, -1 for spare bits octet at the end */
2185 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2186 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 +07002187 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2188 more := false, e := true);
2189 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002190 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2191 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002192 cv := cv,
2193 bsn := ms.ul_tbf.bsn,
2194 blocks := blocks,
2195 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002196 f_ultbf_inc_bsn(ms.ul_tbf);
2197 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2198
2199 T.start(0.5);
2200 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002201 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002202 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2203 f_shutdown(__BFILE__, __LINE__);
2204 }
2205 [] T.timeout {
2206 setverdict(pass);
2207 }
2208 }
2209}
2210/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2211 blocks intentionally contain last byte of data placed in last byte of RLC
2212 containing padding/spare bits, which is incorrect. Spare bits exist and are
2213 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2214 discounting padding in octet" */
2215testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2216 var GprsMS ms;
2217 var integer block_len, max_valid_data_len;
2218
2219 /* Initialize NS/BSSGP side */
2220 f_init_bssgp();
2221 /* Initialize GPRS MS side */
2222 f_init_gprs_ms();
2223 ms := g_ms[0]; /* We only use first MS in this test */
2224
2225 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002226 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002227
2228 /* Establish BSSGP connection to the PCU */
2229 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002230 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002231
2232 /* Establish an Uplink TBF */
2233 f_ms_establish_ul_tbf(ms);
2234
2235 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2236 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2237 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2238
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002239 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002240}
2241
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002242/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2243 * answered, so TBFs for uplink and later for downlink are created.
2244 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002245private 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 +02002246 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002247 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002248 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002249 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002250 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002251
2252 /* Initialize NS/BSSGP side */
2253 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002254 /* Initialize GPRS MS side */
2255 f_init_gprs_ms();
2256 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002257
2258 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002259 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002260
2261 /* Establish BSSGP connection to the PCU */
2262 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002263 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002264
2265 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002266 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002267
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002268 /* Send one UL block (with TLLI since we are in One-Phase Access
2269 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002270 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 +02002271 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2272 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002273 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002274
2275 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002276 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002277
2278 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002279 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2280 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002281
2282 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2283 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002284 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002285
2286 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002287 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2288 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2289 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002290
2291 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002292}
2293
2294/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2295 * answered, so TBFs for uplink and later for downlink are created.
2296 */
2297testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002298 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002299 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002300}
2301
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002302/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2303 * answered, so TBFs for uplink and later for downlink are created.
2304 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002305private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2306 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002307 template (present) CodingScheme exp_ul_cs_mcs := ?,
2308 template (present) CodingScheme exp_dl_cs_mcs := ?)
2309runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002310 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002311 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002312 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002313 var uint32_t sched_fn;
2314 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002315 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002316 var GprsMS ms;
2317
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002318 /* Initialize NS/BSSGP side */
2319 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002320 /* Initialize GPRS MS side */
2321 f_init_gprs_ms();
2322 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002323
2324 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002325 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002326
2327 /* Establish BSSGP connection to the PCU */
2328 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002329 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002330
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002331 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2332 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 +02002333
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002334 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2335 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 +02002336 f_shutdown(__BFILE__, __LINE__);
2337 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002338
2339 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2340 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002341 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002342
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002343 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002344 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 +02002345
2346 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002347 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002348
2349 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002350 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002351 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2352 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002353 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002354 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002355 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002356
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002357 /* PCU acks the UL data after having received CV=0) */
2358 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2359
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002360 /* 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 +02002361 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 +02002362
2363 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002364 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2365 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 +02002366 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002367
2368 f_shutdown(__BFILE__, __LINE__, final := true);
2369}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002370
2371testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002372 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2373 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002374
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002375 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 +01002376
2377 if (mp_osmo_pcu_newer_than_0_9_0) {
2378 var StatsDExpects expect := {
2379 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2380 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2381 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2382 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2383 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2384 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2385 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2386 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2387 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2388 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2389 };
2390 f_statsd_expect(expect);
2391 }
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002392}
2393
2394testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002395 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2396 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002397
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002398 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 +01002399 if (mp_osmo_pcu_newer_than_0_9_0) {
2400 var StatsDExpects expect := {
2401 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2402 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2403 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2404 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2405 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2406 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2407 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2408 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2409 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2410 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2411 };
2412 f_statsd_expect(expect);
2413 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002414}
2415
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002416testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2417 /* Configure PCU to force two phase access */
2418 g_force_two_phase_access := true;
2419
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002420 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002421 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002422
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002423 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 +01002424
2425 if (mp_osmo_pcu_newer_than_0_9_0) {
2426 var StatsDExpects expect := {
2427 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2428 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2429 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2430 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2431 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2432 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2433 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2434 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2435 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2436 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2437 };
2438 f_statsd_expect(expect);
2439 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002440}
2441
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002442/* Test scenario where SGSN wants to send some data against MS and it is
2443 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2444 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002445private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2446 template (present) CodingScheme exp_cs_mcs := ?)
2447runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002448 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002449 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002450 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002451 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002452 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002453
2454 /* Initialize NS/BSSGP side */
2455 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002456 /* Initialize GPRS MS side */
2457 f_init_gprs_ms();
2458 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002459
2460 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002461 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002462
2463 /* Establish BSSGP connection to the PCU */
2464 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002465 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002466
2467 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002468 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2469 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002470
2471 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2472 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002473 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002474
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002475 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002476 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2477 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 +02002478 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002479
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002480 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002481 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002482
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002483 /* Send one UL block (with TLLI since we are in One-Phase Access
2484 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002485 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002486 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2487 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002488 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002489
2490 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002491 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002492
2493 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002494}
2495
2496testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002497 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002498 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2499}
2500
2501/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2502/* information about the MS */
2503testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002504 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002505 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002506}
2507
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002508/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2509 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2510 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2511 * be transferred).
2512 */
2513testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002514 var RlcmacDlBlock dl_block;
2515 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002516 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002517 var octetstring total_payload;
2518 var octetstring payload;
2519 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002520 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002521 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002522 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002523
2524 /* Initialize NS/BSSGP side */
2525 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002526 /* Initialize GPRS MS side */
2527 f_init_gprs_ms();
2528 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002529
2530 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002531 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002532
2533 /* Establish BSSGP connection to the PCU */
2534 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002535 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002536
2537 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002538 f_ms_establish_ul_tbf(ms);
2539 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002540
2541 /* Send one UL block (with TLLI since we are in One-Phase Access
2542 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002543 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 +02002544 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 +02002545
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002546 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2547 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002548 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002549 total_payload := payload;
2550
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002551 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2552
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002553 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002554 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002555 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002556 total_payload := total_payload & payload;
2557
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002558 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002559 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002560 total_payload := total_payload & payload;
2561
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002562 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002563 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 +02002564 total_payload := total_payload & lost_payload;
2565
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002566 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002567 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002568 total_payload := total_payload & payload;
2569
2570 /* 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 +02002571 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002572
2573 /* On CV=0, we'll receive a UL ACK asking about missing block */
2574 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2575 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002576 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2577 tfi := tfi,
2578 cv := 15,
2579 bsn := 3,
2580 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002581 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002582
2583 /* Now final ack is recieved */
2584 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2585 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002586 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002587
2588 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002589 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 +07002590
2591 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002592}
2593
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002594/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2595 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2596 * timeout occurs (specified by sent RRBP on DL block). */
2597testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002598 var RlcmacDlBlock dl_block;
2599 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002600 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002601 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002602
2603 /* Initialize NS/BSSGP side */
2604 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002605 /* Initialize GPRS MS side */
2606 f_init_gprs_ms();
2607 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002608
2609 /* Initialize the PCU interface abstraction */
2610 f_init_raw(testcasename());
2611
2612 /* Establish BSSGP connection to the PCU */
2613 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002614 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002615
2616 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002617 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2618 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002619
2620 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2621 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002622 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002623
2624 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2625 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2626 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002627 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002628
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002629 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2630 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002631 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002632
2633 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002634 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2635 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2636 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002637
2638 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002639}
2640
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002641/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2642testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2643 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2644 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002645 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002646 var RlcmacDlBlock dl_block;
2647 var uint32_t ack_fn;
2648 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002649 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002650 timer T := 5.0;
2651
2652 /* Initialize NS/BSSGP side */
2653 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002654 /* Initialize GPRS MS side */
2655 f_init_gprs_ms();
2656 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002657
2658 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002659 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002660
Daniel Willmann535aea62020-09-21 13:27:08 +02002661 f_statsd_reset();
2662
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002663 /* Establish BSSGP connection to the PCU */
2664 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002665 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002666
2667 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002668 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2669 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002670
2671 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2672 f_sleep(X2002);
2673
2674 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2675 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002676 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002677
2678 /* TDMA frame number on which we are supposed to send the ACK */
2679 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2680
2681 /* SGSN sends more blocks during the indicated RRBP */
2682 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2683 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002684 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002685
2686 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2687
2688 /* Make sure this block has the same TFI as was assigned
2689 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002690 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002691 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2692 dl_block.data.mac_hdr.hdr_ext.tfi);
2693 f_shutdown(__BFILE__, __LINE__);
2694 }
2695
2696 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002697 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002698
2699 /* Break if this is the end of RRBP */
2700 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002701 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002702 break;
2703 }
2704 }
2705
2706 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002707 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 +07002708
2709 /* Make sure that the next block (after the Ack) is dummy */
2710 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2711
Daniel Willmann535aea62020-09-21 13:27:08 +02002712 var StatsDExpects expect := {
2713 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2714 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2715 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2716 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2717 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002718 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002719 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2720 };
2721 f_statsd_expect(expect);
2722
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002723 f_shutdown(__BFILE__, __LINE__, final := true);
2724}
2725
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002726/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2727 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2728 * Check "3GPP TS 44.060" Annex B. */
2729testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2730 var RlcmacDlBlock dl_block;
2731 var octetstring dataA := f_rnd_octstring(20);
2732 var octetstring dataB := f_rnd_octstring(13);
2733 var octetstring dataC := f_rnd_octstring(3);
2734 var octetstring dataD := f_rnd_octstring(12);
2735 var uint32_t sched_fn;
2736 var GprsMS ms;
2737 var template (value) RlcmacUlBlock ul_data;
2738
2739 /* Initialize NS/BSSGP side */
2740 f_init_bssgp();
2741 /* Initialize GPRS MS side */
2742 f_init_gprs_ms();
2743 ms := g_ms[0]; /* We only use first MS in this test */
2744
2745 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002746 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002747
2748 /* Establish BSSGP connection to the PCU */
2749 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002750 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002751
2752 /* Establish an Uplink TBF */
2753 f_ms_establish_ul_tbf(ms);
2754
2755 /* Summary of what's transmitted:
2756 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2757 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2758 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2759 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2760 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2761 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2762 */
2763
2764 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002765 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2766 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002767 cv := 3,
2768 bsn := ms.ul_tbf.bsn,
2769 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2770 tlli := ms.tlli);
2771 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2772 * RLCMAC block being sent. */
2773 ul_data.data.mac_hdr.e := true;
2774 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002775 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002776
2777 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002778 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2779 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002780 cv := 2,
2781 bsn := ms.ul_tbf.bsn,
2782 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2783 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2784 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2785 },
2786 tlli := ms.tlli);
2787 f_ultbf_inc_bsn(ms.ul_tbf);
2788 f_ms_tx_ul_block(ms, ul_data);
2789
2790 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002791 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 +02002792
2793 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002794 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2795 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002796 cv := 1,
2797 bsn := ms.ul_tbf.bsn,
2798 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2799 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2800 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2801 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2802 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2803 },
2804 tlli := ms.tlli);
2805 f_ultbf_inc_bsn(ms.ul_tbf);
2806 f_ms_tx_ul_block(ms, ul_data);
2807
2808 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002809 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2810 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 +02002811
2812 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002813 ul_data := t_RLCMAC_UL_DATA_TLLI(
2814 cs := CS_1,
2815 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002816 cv := 0,
2817 bsn := ms.ul_tbf.bsn,
2818 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2819 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2820 },
2821 tlli := ms.tlli);
2822 f_ultbf_inc_bsn(ms.ul_tbf);
2823 f_ms_tx_ul_block(ms, ul_data);
2824
2825 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002826 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 +02002827
2828 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2829 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2830 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2831
2832 f_shutdown(__BFILE__, __LINE__, final := true);
2833}
2834
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002835/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2836 * ACK/NACK is not answered */
2837testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2838 var RlcmacDlBlock dl_block;
2839 var octetstring data1 := f_rnd_octstring(200);
2840 var octetstring data2 := f_rnd_octstring(10);
2841 var uint32_t dl_fn;
2842 var GprsMS ms;
2843 var template (value) TsTrxBtsNum nr;
2844 var BTS_PDTCH_Block data_msg;
2845
2846 /* Initialize NS/BSSGP side */
2847 f_init_bssgp();
2848 /* Initialize GPRS MS side */
2849 f_init_gprs_ms();
2850 ms := g_ms[0]; /* We only use first MS in this test */
2851
2852 /* Initialize the PCU interface abstraction */
2853 f_init_raw(testcasename())
2854
2855 /* Establish BSSGP connection to the PCU */
2856 f_bssgp_establish();
2857 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2858
2859 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2860 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2861 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2862
2863 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2864 f_sleep(X2002);
2865
2866 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2867 while (true) {
2868 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2869
2870 /* Keep Ack/Nack description updated (except for last BSN) */
2871 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2872
2873 if (f_dl_block_rrbp_valid(dl_block)) {
2874 /* Don't transmit DL ACK here on purpose ignore it */
2875 break;
2876 }
2877 }
2878
2879 /* PCU starts whole process again */
2880 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2881
2882 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2883 f_sleep(X2002);
2884
2885 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2886 /* DL data), after that we receive only DUMMY blocks so we are done */
2887 var boolean data_received := false;
2888 nr := ts_TsTrxBtsNum;
2889 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2890 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2891 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2892 block_nr := nr.blk_nr));
2893 alt {
2894 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2895 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2896 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2897 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2898 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2899 tr_RLCMAC_DATA)) -> value data_msg {
2900 data_received := true;
2901 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2902 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2903 log("Received FINAL_ACK");
2904 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2905 }
2906 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2907 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2908 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2909 }
2910 nr := ts_TsTrxBtsNum;
2911 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2912 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2913 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2914 block_nr := nr.blk_nr));
2915 repeat;
2916 }
2917 [] BTS.receive {
2918 setverdict(fail, "Unexpected BTS message");
2919 f_shutdown(__BFILE__, __LINE__);
2920 }
2921 }
2922
2923 f_shutdown(__BFILE__, __LINE__, final := true);
2924}
2925
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002926/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2927testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002928 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002929 var octetstring data := f_rnd_octstring(10);
2930 var PacketDlAssign dl_tbf_ass;
2931 var RlcmacDlBlock dl_block;
2932 var uint32_t poll_fn;
2933 var uint32_t sched_fn;
2934 var GprsMS ms;
2935 timer T := 5.0;
2936
2937 /* Initialize NS/BSSGP side */
2938 f_init_bssgp();
2939 /* Initialize GPRS MS side */
2940 f_init_gprs_ms();
2941 ms := g_ms[0]; /* We only use first MS in this test */
2942
2943 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002944 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2945 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002946
2947 /* Initialize the PCU interface abstraction */
2948 f_init_raw(testcasename(), info_ind);
2949
2950 /* Establish BSSGP connection to the PCU */
2951 f_bssgp_establish();
2952 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2953
2954 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2955 through PDCH (no multiblock assignment possible through PCH) */
2956 f_ms_establish_ul_tbf(ms);
2957
2958 /* Send one UL block (with TLLI since we are in One-Phase Access
2959 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002960 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2961 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002962 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2963 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2964
2965 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2966 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2967 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2968 gprsextendeddynalloccap := '0'B
2969 };
2970 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2971 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2972 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2973 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2974 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2975 f_shutdown(__BFILE__, __LINE__);
2976 }
2977 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2978
2979 f_shutdown(__BFILE__, __LINE__, final := true);
2980}
2981
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002982testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002983 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002984 var RlcmacDlBlock dl_block;
2985 var octetstring data := f_rnd_octstring(10);
2986 var PollFnCtx pollctx;
2987 var uint32_t sched_fn;
2988 var GprsMS ms;
2989
2990 var MultislotCap_GPRS mscap_gprs := {
2991 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2992 gprsextendeddynalloccap := '0'B
2993 };
2994 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2995
2996
2997 /* Initialize NS/BSSGP side */
2998 f_init_bssgp();
2999 /* Initialize GPRS MS side */
3000 f_init_gprs_ms();
3001 ms := g_ms[0]; /* We only use first MS in this test */
3002
3003 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003004 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3005 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003006
3007 /* Initialize the PCU interface abstraction */
3008 f_init_raw(testcasename(), info_ind);
3009
3010 /* Establish BSSGP connection to the PCU */
3011 f_bssgp_establish();
3012 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3013
3014 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3015 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3016
3017 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3018 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3019
3020 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3021 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3022 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3023 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3024 f_shutdown(__BFILE__, __LINE__);
3025 }
3026 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3027
3028 f_shutdown(__BFILE__, __LINE__, final := true);
3029}
3030
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003031testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3032 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3033 var RlcmacDlBlock dl_block;
3034 var octetstring data := f_rnd_octstring(10);
3035 var PollFnCtx pollctx;
3036 var uint32_t sched_fn;
3037 var GprsMS ms;
3038
3039 var MultislotCap_GPRS mscap_gprs := {
3040 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3041 gprsextendeddynalloccap := '0'B
3042 };
3043 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3044
3045
3046 /* Initialize NS/BSSGP side */
3047 f_init_bssgp();
3048 /* Initialize GPRS MS side */
3049 f_init_gprs_ms();
3050 ms := g_ms[0]; /* We only use first MS in this test */
3051
3052 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003053 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3054 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003055
3056 /* Initialize the PCU interface abstraction */
3057 f_init_raw(testcasename(), info_ind);
3058
3059 /* Establish BSSGP connection to the PCU */
3060 f_bssgp_establish();
3061 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3062
3063 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3064 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3065
3066 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3067 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3068 f_shutdown(__BFILE__, __LINE__);
3069 }
3070
3071 f_shutdown(__BFILE__, __LINE__, final := true);
3072}
3073
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003074/* Test scenario where MS wants to request a new TBF once the current one is
3075 * ending, by means of sending a Packet Resource Request on ul slot provided by
3076 * last Pkt Ul ACK's RRBP.
3077 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3078testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003079 var RlcmacDlBlock dl_block;
3080 var octetstring data := f_rnd_octstring(10);
3081 var uint32_t sched_fn;
3082 var uint32_t dl_fn;
3083 var template RlcmacDlBlock acknack_tmpl;
3084 var GprsMS ms;
3085
3086 /* Initialize NS/BSSGP side */
3087 f_init_bssgp();
3088 /* Initialize GPRS MS side */
3089 f_init_gprs_ms();
3090 ms := g_ms[0]; /* We only use first MS in this test */
3091
3092 /* Initialize the PCU interface abstraction */
3093 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003094 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003095
3096 /* Establish BSSGP connection to the PCU */
3097 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003098 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003099
3100 /* Establish an Uplink TBF */
3101 f_ms_establish_ul_tbf(ms);
3102
3103 /* Send one UL block (with TLLI since we are in One-Phase Access
3104 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003105 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 +02003106
3107 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003108 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003109
3110 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3111 tr_UlAckNackGprs(ms.tlli,
3112 tr_AckNackDescription(final_ack := '1'B),
3113 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3114 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3115
3116 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3117
3118 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003119 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 +07003120 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003121 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3122 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3123
3124 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3125 and make sure it is ACKED fine */
3126 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3127
3128 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003129 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003130
3131 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3132 /* ACK the ACK */
3133 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3134
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003135 if (mp_osmo_pcu_newer_than_0_9_0) {
3136 var StatsDExpects expect := {
3137 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3138 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3139 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3140 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3141 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3142 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3143 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3144 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3145 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3146 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3147 };
3148 f_statsd_expect(expect);
3149 }
3150
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003151 f_shutdown(__BFILE__, __LINE__, final := true);
3152}
3153
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003154/* Test scenario where MS wants to request a new TBF once the current one is
3155 * ending, by means of sending a Packet Resource Request on ul slot provided by
3156 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3157 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3158testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3159 var PCUIF_info_ind info_ind;
3160 var RlcmacDlBlock dl_block;
3161 var octetstring data := f_rnd_octstring(10);
3162 var uint32_t sched_fn;
3163 var uint32_t dl_fn;
3164 var template (value) TsTrxBtsNum nr;
3165 var BTS_PDTCH_Block data_msg;
3166 var template RlcmacDlBlock acknack_tmpl;
3167 var GprsMS ms;
3168 const integer N3105_MAX := 2;
3169 var integer N3105 := 0;
3170 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3171
3172 /* Initialize NS/BSSGP side */
3173 f_init_bssgp();
3174 /* Initialize GPRS MS side */
3175 f_init_gprs_ms();
3176 ms := g_ms[0]; /* We only use first MS in this test */
3177
3178 /* Initialize the PCU interface abstraction */
3179 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3180 /* Speedup test: */
3181 info_ind.n3105 := N3105_MAX;
3182 info_ind.t3195 := 1;
3183 f_init_raw(testcasename(), info_ind);
3184
3185 /* Establish BSSGP connection to the PCU */
3186 f_bssgp_establish();
3187 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3188
3189 /* Establish an Uplink TBF */
3190 f_ms_establish_ul_tbf(ms);
3191
3192 /* Send one UL block (with TLLI since we are in One-Phase Access
3193 contention resoultion) and make sure it is ACKED fine */
3194 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3195
3196 /* UL block should be received in SGSN */
3197 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3198
3199 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3200 tr_UlAckNackGprs(ms.tlli,
3201 tr_AckNackDescription(final_ack := '1'B),
3202 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3203 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3204
3205 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3206
3207 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3208 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3209
3210 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3211 /* Now we go on receiving DL data and not answering RRBP: */
3212 nr := ts_TsTrxBtsNum;
3213 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3214 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3215 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3216 block_nr := nr.blk_nr));
3217 alt {
3218 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3219 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3220 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3221 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3222 log("Ignoring RRBP N3105 ", N3105);
3223 N3105 := N3105 + 1;
3224 }
3225 nr := ts_TsTrxBtsNum;
3226 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3227 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3228 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3229 block_nr := nr.blk_nr));
3230 repeat;
3231 }
3232 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3233 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3234 */
3235 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3236 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3237 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3238 if (not T_3195.running) {
3239 T_3195.start;
3240 }
3241 nr := ts_TsTrxBtsNum;
3242 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3243 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3244 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3245 block_nr := nr.blk_nr));
3246 repeat;
3247 }
3248 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3249 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3250 omit)) -> value data_msg {
3251 /* We may already receive idle blocks before our own TTCN3 timer
3252 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3253 nr := ts_TsTrxBtsNum;
3254 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3255 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3256 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3257 block_nr := nr.blk_nr));
3258 repeat;
3259 }
3260 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3261 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3262 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3263 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3264 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3265 nr := ts_TsTrxBtsNum;
3266 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3267 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3268 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3269 block_nr := nr.blk_nr));
3270 repeat;
3271 }
3272 [T_3195.running] T_3195.timeout {
3273 log("T_3195 timeout");
3274 /* Done in alt, wait for pending RTS initiated previously in
3275 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3276 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3277 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3278 omit));
3279 }
3280 [] BTS.receive {
3281 setverdict(fail, "Unexpected BTS message");
3282 f_shutdown(__BFILE__, __LINE__);
3283 }
3284 }
3285
3286 f_shutdown(__BFILE__, __LINE__, final := true);
3287}
3288
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003289/* Test CS paging over the BTS<->PCU socket.
3290 * 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.
3291 * Paging should be send on the PACCH.
3292 *
3293 * 1. Send a Paging Request over PCU socket.
3294 * 2. Send a Ready-To-Send message over PCU socket
3295 * 3. Expect a Paging Frame
3296 */
3297testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003298 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003299 var MobileIdentityLV mi;
3300 var octetstring mi_enc_lv;
3301 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003302 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003303
3304 /* Initialize NS/BSSGP side */
3305 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003306 /* Initialize GPRS MS side */
3307 f_init_gprs_ms();
3308 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003309
3310 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003311 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003312
3313 /* Establish BSSGP connection to the PCU */
3314 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003315 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003316
3317 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003318 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003319
3320 /* build mobile Identity */
3321 mi := valueof(ts_MI_IMSI_LV(imsi));
3322 mi_enc_lv := enc_MobileIdentityLV(mi);
3323 /* Send paging request */
3324 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3325 sapi :=PCU_IF_SAPI_PDTCH));
3326
3327 /* Receive it on BTS side towards MS */
3328 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3329
3330 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003331 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3332 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3333 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3334 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003335
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003336 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003337}
3338
3339/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3340 */
3341private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3342runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003343 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003344 var hexstring imsi := f_gen_imsi(42);
3345 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003346 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003347
3348 /* Initialize NS/BSSGP side */
3349 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003350 /* Initialize GPRS MS side */
3351 f_init_gprs_ms();
3352 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003353
3354 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003355 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003356
3357 /* Establish BSSGP connection to the PCU */
3358 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003359 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003360
3361 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003362 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003363
3364 /* Send paging request with or without TMSI */
3365 if (use_ptmsi) {
3366 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3367 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3368 } else {
3369 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3370 }
3371
3372 /* Receive it on BTS side towards MS */
3373 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3374
3375 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003376 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003377 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003378 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3379 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3380 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003381 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003382 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3383 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3384 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003385 }
3386
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003387 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003388}
3389
3390testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3391 f_tc_paging_cs_from_sgsn(0, true);
3392}
3393
3394testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3395 f_tc_paging_cs_from_sgsn(0);
3396}
3397
3398testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003399 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003400}
3401
3402/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3403 */
3404private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3405runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003406 var integer imsi_suff_tx := 423;
3407 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003408 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003409
3410 /* Initialize NS/BSSGP side */
3411 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003412 /* Initialize GPRS MS side */
3413 f_init_gprs_ms();
3414 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003415
Oliver Smith61b4e732021-07-22 08:14:29 +02003416 f_statsd_reset();
3417
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003418 /* Establish BSSGP connection to the PCU */
3419 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003420 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003421
3422 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3423 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3424 if (use_ptmsi) {
3425 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3426 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3427 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3428 } else {
3429 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3430 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3431 }
3432
Oliver Smith61b4e732021-07-22 08:14:29 +02003433 if (mp_osmo_pcu_newer_than_0_9_0) {
3434 var StatsDExpects expect := {
Oliver Smith36d95d82021-08-06 22:01:53 +02003435 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3436 /* After the PCU receives the paging request from SGSN,
3437 * and it doesn't have any errors, PCU sends it to the
3438 * BTS to do paging over PCH. */
3439 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
Oliver Smith61b4e732021-07-22 08:14:29 +02003440 };
3441 f_statsd_expect(expect);
3442 }
Oliver Smithfbd39312021-07-27 15:23:39 +02003443}
3444
3445testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3446 /* Initialize the PCU interface abstraction */
3447 f_init_raw(testcasename());
3448
3449 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003450
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003451 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003452}
3453
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003454testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003455 /* Initialize the PCU interface abstraction */
3456 f_init_raw(testcasename());
3457
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003458 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003459
3460 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003461}
3462
3463testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003464 /* Initialize the PCU interface abstraction */
3465 f_init_raw(testcasename());
3466
Harald Welte5339b2e2020-10-04 22:52:56 +02003467 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003468
3469 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003470}
3471
Oliver Smithe1a77c42021-07-28 13:36:09 +02003472testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3473 /* Initialize the PCU interface abstraction */
3474 f_init_raw(testcasename());
3475
3476 /* Set T3113 to 1s to shorten the test duration */
3477 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3478
3479 /* Reset stats and send paging PS request */
3480 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3481
3482 /* Verify that counter increases when T3113 times out (MS did not start
3483 * TBF to respond to paging). */
3484 f_sleep(1.2);
3485 var StatsDExpects expect := {
3486 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3487 };
3488 f_statsd_expect(expect);
3489
3490 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3491 f_shutdown(__BFILE__, __LINE__, final := true);
3492}
3493
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003494/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3495testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3496 var RlcmacDlBlock dl_block;
3497 var octetstring data := f_rnd_octstring(10);
3498 var uint32_t sched_fn;
3499 var uint32_t dl_fn;
3500 var GprsMS ms;
3501
3502 /* Initialize NS/BSSGP side */
3503 f_init_bssgp();
3504 /* Initialize GPRS MS side */
3505 f_init_gprs_ms();
3506 ms := g_ms[0]; /* We only use first MS in this test */
3507
3508 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003509 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003510
Daniel Willmann535aea62020-09-21 13:27:08 +02003511 f_statsd_reset();
3512
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003513 /* Establish BSSGP connection to the PCU */
3514 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003515 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003516
3517 /* Establish an Uplink TBF */
3518 f_ms_establish_ul_tbf(ms);
3519
3520 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003521 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 +02003522 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3523 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3524 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3525
3526 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003527 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003528
3529 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3530 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3531 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3532
3533 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3534 f_sleep(X2002);
3535 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3536
3537 /* ACK the DL block */
3538 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3539 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3540 f_dl_block_ack_fn(dl_block, dl_fn));
3541
Daniel Willmann535aea62020-09-21 13:27:08 +02003542 var StatsDExpects expect := {
3543 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3544 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3545 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3546 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003547 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003548 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003549 };
3550 f_statsd_expect(expect);
3551
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003552 f_shutdown(__BFILE__, __LINE__, final := true);
3553}
3554
3555/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3556testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3557 var RlcmacDlBlock dl_block;
3558 var octetstring data := f_rnd_octstring(10);
3559 var uint32_t sched_fn;
3560 var uint32_t dl_fn;
3561 var GprsMS ms;
3562
3563 /* Initialize NS/BSSGP side */
3564 f_init_bssgp();
3565 /* Initialize GPRS MS side */
3566 f_init_gprs_ms();
3567 ms := g_ms[0]; /* We only use first MS in this test */
3568
3569 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003570 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003571
3572 /* Establish BSSGP connection to the PCU */
3573 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003574 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003575
3576 /* Establish an Uplink TBF */
3577 f_ms_establish_ul_tbf(ms);
3578
3579 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003580 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 +02003581 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3582 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3583 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3584
3585 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003586 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003587
3588 /* Now SGSN sends some DL data with an invalid IMSI */
3589 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3590
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003591 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003592
3593 /* TODO: make sure no data is sent over PCU -> MS */
3594
3595 f_shutdown(__BFILE__, __LINE__, final := true);
3596}
3597
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003598private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3599 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3600 var octetstring data := f_rnd_octstring(6);
3601 var RlcmacDlBlock dl_block;
3602 var GprsMS ms;
3603 var uint32_t fn;
3604
3605 /* Initialize NS/BSSGP side */
3606 f_init_bssgp();
3607 /* Initialize GPRS MS side */
3608 f_init_gprs_ms();
3609 ms := g_ms[0]; /* We only use first MS in this test */
3610
3611 /* Initialize the PCU interface abstraction */
3612 f_init_raw(testcasename());
3613
3614 /* Establish BSSGP connection to the PCU */
3615 f_bssgp_establish();
3616 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3617
3618 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3619 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3620 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3621
3622 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3623 f_sleep(X2002);
3624
3625 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3626 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3627
3628 if (ischosen(dl_block.data_egprs)) {
3629 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3630 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3631 f_shutdown(__BFILE__, __LINE__);
3632 }
3633 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3634 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3635 f_shutdown(__BFILE__, __LINE__);
3636 }
3637 if (not match(dl_block.data_egprs.blocks[1].payload,
3638 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3639 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3640 f_shutdown(__BFILE__, __LINE__);
3641 }
3642 } else if (lengthof(dl_block.data.blocks) > 1) {
3643 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3644 f_shutdown(__BFILE__, __LINE__);
3645 }
3646
3647 f_shutdown(__BFILE__, __LINE__, final := true);
3648}
3649
3650/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3651 * containing llc data. See OS#4849 */
3652testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3653 f_tc_dl_data_no_llc_ui_dummy(omit);
3654}
3655
3656/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3657 * containing llc data. See OS#4849 */
3658testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003659 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003660}
3661
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003662private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003663 template GsmRrMessage t_imm_ass := ?,
3664 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003665runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003666 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003667 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003668
3669 ra11 := enc_EGPRSPktChRequest2uint(req);
3670 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3671
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003672 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003673 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003674 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003675 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003676 }
3677
3678 setverdict(pass);
3679}
3680
3681testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3682 var template GsmRrMessage imm_ass;
3683 var template IaRestOctets rest;
3684 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003685 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003686
3687 /* Initialize the PCU interface abstraction */
3688 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003689 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003690
3691 var EGPRSPktChRequest req := {
3692 /* NOTE: other fields are set in the loop */
3693 signalling := { tag := '110011'B }
3694 };
3695
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003696 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003697 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3698 req.signalling.random_bits := ext_ra;
3699
3700 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3701 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3702 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3703 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3704
3705 f_TC_egprs_pkt_chan_req(req, imm_ass);
3706 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003707
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003708 if (mp_osmo_pcu_newer_than_0_9_0) {
3709 var StatsDExpects expect := {
3710 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3711 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3712 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3713 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3714 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3715 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3716 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3717 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3718 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3719 };
3720 f_statsd_expect(expect);
3721 }
3722
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003723 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003724}
3725
3726testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3727 var template GsmRrMessage imm_ass;
3728 var template IaRestOctets rest;
3729 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003730 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003731
3732 /* Initialize the PCU interface abstraction */
3733 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003734 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003735
3736 var EGPRSPktChRequest req := {
3737 /* NOTE: other fields are set in the loop */
3738 one_phase := { tag := '0'B }
3739 };
3740
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003741 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003742 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3743 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3744 var BIT2 priority := substr(ext_ra, 0, 2);
3745 var BIT3 rand := substr(ext_ra, 2, 3);
3746
3747 req.one_phase.multislot_class := mslot_class;
3748 req.one_phase.priority := priority;
3749 req.one_phase.random_bits := rand;
3750
3751 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3752 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3753 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3754 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3755
3756 f_TC_egprs_pkt_chan_req(req, imm_ass);
3757 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003758
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003759 if (mp_osmo_pcu_newer_than_0_9_0) {
3760 var StatsDExpects expect := {
3761 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3762 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3763 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
3764 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3765 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3766 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
3767 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3768 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3769 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3770 };
3771 f_statsd_expect(expect);
3772 }
3773
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003774 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003775}
3776
3777testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3778 var template GsmRrMessage imm_ass;
3779 var template IaRestOctets rest;
3780 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003781 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003782
3783 /* Initialize the PCU interface abstraction */
3784 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003785 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003786
3787 var EGPRSPktChRequest req := {
3788 /* NOTE: other fields are set in the loop */
3789 two_phase := { tag := '110000'B }
3790 };
3791
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003792 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003793 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3794 var BIT2 priority := substr(ext_ra, 0, 2);
3795 var BIT3 rand := substr(ext_ra, 2, 3);
3796
3797 req.two_phase.priority := priority;
3798 req.two_phase.random_bits := rand;
3799
3800 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3801 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3802 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3803 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3804
3805 f_TC_egprs_pkt_chan_req(req, imm_ass);
3806 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003807
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003808 if (mp_osmo_pcu_newer_than_0_9_0) {
3809 var StatsDExpects expect := {
3810 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3811 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3812 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3813 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3814 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3815 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3816 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3817 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3818 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3819 };
3820 f_statsd_expect(expect);
3821 }
3822
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003823 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003824}
3825
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003826private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3827 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003828 PCUIF_BurstType bt := BURST_TYPE_1,
3829 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003830runs on RAW_PCU_Test_CT {
3831 var template ReqRefWaitInd tr_ref;
3832 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003833
3834 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3835 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3836 ra := bit2int(ra11), is_11bit := 1,
3837 burst_type := bt, fn := fn,
3838 arfcn := 871));
3839
3840 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003841 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003842
3843 /* Just to have a short-name reference to the actual message */
3844 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3845
3846 /* Make sure that Request Reference list contains at least one entry
3847 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003848 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003849 if (not match(iar.payload, { *, tr_ref, * })) {
3850 setverdict(fail, "Request Reference list does not match");
3851 f_shutdown(__BFILE__, __LINE__);
3852 }
3853
3854 /* Match Feature Indicator (must indicate PS domain) */
3855 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3856 setverdict(fail, "Feature Indicator does not match");
3857 f_shutdown(__BFILE__, __LINE__);
3858 }
3859
3860 /* Match IAR Rest Octets */
3861 if (not match(iar.rest_octets, rest)) {
3862 setverdict(fail, "IAR Rest Octets does not match: ",
3863 iar.rest_octets, " vs expected ", rest);
3864 f_shutdown(__BFILE__, __LINE__);
3865 }
3866
3867 setverdict(pass);
3868}
3869
3870/* Verify the contents of RR Immediate Assignment Reject message and its
3871 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3872testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3873 var template IARRestOctets rest;
3874 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003875 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003876
3877 /* Initialize the PCU interface abstraction */
3878 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003879 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003880
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003881 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003882 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3883 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3884
3885 /* Intentionally incorrect message (see table 11.2.5a.2) */
3886 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3887 }
3888
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003889 if (mp_osmo_pcu_newer_than_0_9_0) {
3890 var StatsDExpects expect := {
3891 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3892 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3893 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3894 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3895 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
3896 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
3897 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
3898 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3899 };
3900 f_statsd_expect(expect);
3901 }
3902
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003903 f_shutdown(__BFILE__, __LINE__, final := true);
3904}
3905
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003906/* At the moment, the IUT does not support any emergency services. Make sure
3907 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3908testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3909 var template IARRestOctets rest;
3910 var BIT5 ext_ra;
3911 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003912 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003913
3914 /* Initialize the PCU interface abstraction */
3915 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003916 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003917
3918 var EGPRSPktChRequest req := {
3919 /* NOTE: other fields are set in the loop */
3920 emergency := { tag := '110111'B }
3921 };
3922
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003923 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003924 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3925 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3926
3927 req.emergency.random_bits := ext_ra;
3928 ra11 := enc_EGPRSPktChRequest2bits(req);
3929
3930 /* Intentionally incorrect message (see table 11.2.5a.2) */
3931 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3932 }
3933
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003934 if (mp_osmo_pcu_newer_than_0_9_0) {
3935 var StatsDExpects expect := {
3936 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3937 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3938 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3939 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3940 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
3941 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
3942 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
3943 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3944 };
3945 f_statsd_expect(expect);
3946 }
3947
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003948 f_shutdown(__BFILE__, __LINE__, final := true);
3949}
3950
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003951/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3952testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003953 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003954 var template IARRestOctets rest;
3955 var BIT11 ra11;
3956
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003957 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003958 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003959
3960 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003961 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3962 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003963
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003964 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003965 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003966 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003967
3968 var EGPRSPktChRequest req := {
3969 one_phase := {
3970 tag := '0'B,
3971 multislot_class := '10101'B,
3972 priority := '01'B,
3973 random_bits := '101'B
3974 }
3975 };
3976
3977 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3978 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3979 for (var integer i := 0; i < 7; i := i + 1) {
3980 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3981 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3982 }
3983
3984 ra11 := enc_EGPRSPktChRequest2bits(req);
3985 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3986
3987 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003988 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003989
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003990 if (mp_osmo_pcu_newer_than_0_9_0) {
3991 var StatsDExpects expect := {
3992 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
3993 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
3994 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
3995 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3996 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
3997 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
3998 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
3999 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4000 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4001 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4002 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4003 };
4004 f_statsd_expect(expect);
4005 }
4006
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004007 f_shutdown(__BFILE__, __LINE__, final := true);
4008}
4009
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004010/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004011private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004012return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004013 /* Pick a random MA length in range 2 .. max_ma_len */
4014 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4015
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004016 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4017 hsn := f_rnd_int(63),
4018 maio := f_rnd_int(63),
4019 ma := f_rnd_bitstring(ma_len));
4020}
4021
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004022private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4023 in GsmRrMessage rr_msg)
4024{
4025 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004026 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004027
4028 var template PacketChannelDescription tr_pkt_chan_desc := {
4029 channel_Type_spare := ?,
4030 tn := ?,
4031 tsc := ts.tsc,
4032 presence := '1'B,
4033 zero := omit,
4034 one := {
4035 maio := ts.maio,
4036 hsn := ts.hsn
4037 }
4038 };
4039
4040 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4041 setverdict(fail, "Packet Channel Description does not match: ",
4042 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4043 }
4044
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004045 /* Mobile Allocation is expected to be octet-aligned */
4046 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4047 var template MobileAllocationLV tr_ma := {
4048 len := ma_oct_len, /* in bytes */
4049 ma := substr(ts.ma, 0, ma_oct_len * 8)
4050 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004051
4052 if (not match(ia.mobile_allocation, tr_ma)) {
4053 setverdict(fail, "Mobile Allocation does not match: ",
4054 ia.mobile_allocation, " vs ", tr_ma);
4055 }
4056
4057 setverdict(pass);
4058}
4059
4060/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4061testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004062 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004063 var GprsMS ms := valueof(t_GprsMS_def);
4064
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004065 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004066 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004067
4068 /* Initialize the PCU interface abstraction */
4069 f_init_raw(testcasename(), info_ind);
4070
4071 /* EGPRS Packet Channel Request (cause=Signalling) */
4072 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4073
4074 /* Establish an Uplink EGPRS TBF */
4075 f_ms_establish_ul_tbf(ms);
4076
4077 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4078 f_shutdown(__BFILE__, __LINE__, final := true);
4079}
4080
4081/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4082testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004083 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004084 var GprsMS ms := valueof(t_GprsMS_def);
4085
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004086 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004087 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004088
4089 /* Initialize the PCU interface abstraction */
4090 f_init_raw(testcasename(), info_ind);
4091
4092 /* Establish an Uplink TBF */
4093 f_ms_establish_ul_tbf(ms);
4094
4095 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4096 f_shutdown(__BFILE__, __LINE__, final := true);
4097}
4098
4099/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4100testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004101 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004102 var GprsMS ms := valueof(t_GprsMS_def);
4103
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004104 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004105 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004106
4107 /* Initialize NS/BSSGP side */
4108 f_init_bssgp();
4109
4110 /* Initialize the PCU interface abstraction */
4111 f_init_raw(testcasename(), info_ind);
4112
4113 /* Establish BSSGP connection to the PCU */
4114 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004115 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004116
4117 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4118 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4119 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4120
4121 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4122 f_shutdown(__BFILE__, __LINE__, final := true);
4123}
4124
4125private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4126 in FrequencyParameters fp)
4127{
4128 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004129 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004130
4131 /* Table 12.8.1: Frequency Parameters information elements */
4132 var template FrequencyParameters tr_fp := {
4133 tsc := ts.tsc,
4134 presence := '10'B, /* Direct encoding 1 */
4135 arfcn := omit,
4136 indirect := omit,
4137 direct1 := {
4138 maio := ts.maio,
4139 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4140 mobile_allocation := {
4141 hsn := ts.hsn,
4142 rfl_number_list_present := '0'B,
4143 rfl_number_list := omit,
4144 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004145 ma_length := ts.ma_bit_len,
4146 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004147 }
4148 },
4149 direct2 := omit
4150 };
4151
4152 if (not match(fp, tr_fp)) {
4153 setverdict(fail, "Frequency Parameters IE does not match: ",
4154 fp, " vs ", tr_fp);
4155 }
4156
4157 setverdict(pass);
4158}
4159
4160/* Make sure that Packet Uplink Assignment contains hopping parameters */
4161testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004162 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004163 var GprsMS ms := valueof(t_GprsMS_def);
4164 var uint32_t poll_fn;
4165
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004166 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004167 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004168
4169 /* Initialize the PCU interface abstraction */
4170 f_init_raw(testcasename(), info_ind);
4171
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004172 /* Single block (two phase) packet access */
4173 var uint16_t ra := bit2int(chan_req_sb);
4174 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4175
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004176 /* Establish an Uplink TBF */
4177 f_ms_establish_ul_tbf(ms);
4178
4179 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004180 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4181 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004182
4183 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004184 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4185 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004186
4187 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4188 var template (omit) FrequencyParameters fp;
4189 if (ua.is_egprs == '1'B) {
4190 fp := ua.egprs.freq_par;
4191 } else {
4192 fp := ua.gprs.freq_par;
4193 }
4194
4195 /* This is an optional IE, so it's worth to check its presence */
4196 if (istemplatekind(fp, "omit")) {
4197 setverdict(fail, "Frequency Parameters IE is not present");
4198 f_shutdown(__BFILE__, __LINE__);
4199 }
4200
4201 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4202 f_shutdown(__BFILE__, __LINE__, final := true);
4203}
4204
4205/* Make sure that Packet Downlink Assignment contains hopping parameters */
4206testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004207 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004208 var octetstring data := f_rnd_octstring(10);
4209 var GprsMS ms := valueof(t_GprsMS_def);
4210 var RlcmacDlBlock dl_block;
4211 var uint32_t poll_fn;
4212
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004213 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004214 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004215
4216 /* Initialize NS/BSSGP side */
4217 f_init_bssgp();
4218
4219 /* Initialize the PCU interface abstraction */
4220 f_init_raw(testcasename(), info_ind);
4221
4222 /* Establish BSSGP connection to the PCU */
4223 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004224 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004225
4226 /* Establish an Uplink TBF */
4227 f_ms_establish_ul_tbf(ms);
4228
4229 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004230 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 +07004231
4232 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4233 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4234 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4235
4236 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4237 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4238
4239 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004240 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4241 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004242
4243 /* This is an optional IE, so it's worth to check its presence */
4244 if (not ispresent(da.freq_par)) {
4245 setverdict(fail, "Frequency Parameters IE is not present");
4246 f_shutdown(__BFILE__, __LINE__);
4247 }
4248
4249 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4250 f_shutdown(__BFILE__, __LINE__, final := true);
4251}
4252
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004253/* Check if the IUT handles subsequent INFO.ind messages */
4254testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004255 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004256 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004257
4258 /* Initialize the PCU interface abstraction */
4259 f_init_raw(testcasename(), info_ind);
4260
4261 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4262 for (var integer i := 0; i < 16; i := i + 1) {
4263 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004264 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004265 }
4266
4267 f_shutdown(__BFILE__, __LINE__, final := true);
4268}
4269
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004270/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4271testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4272 var PCUIF_info_ind info_ind;
4273 var integer i;
4274 const integer num_ms := 8;
4275
4276 /* Initialize NS/BSSGP side */
4277 f_init_bssgp();
4278 /* Initialize GPRS MS side */
4279 f_init_gprs_ms(num_ms);
4280
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004281 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004282 /* Only the 3 first TRX are enabled. The enabled ones all have same
4283 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004284 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4285 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4286 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4287 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004288
4289 /* Initialize the PCU interface abstraction */
4290 f_init_raw(testcasename(), info_ind);
4291
4292 /* Establish BSSGP connection to the PCU */
4293 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004294 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004295
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004296 /* Establish an Uplink TBF for each GprsMS instance */
4297 f_multi_ms_establish_tbf(do_activate := false);
4298
4299 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004300 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004301 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004302 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004303 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004304 f_shutdown(__BFILE__, __LINE__);
4305 }
4306 }
4307
4308 f_shutdown(__BFILE__, __LINE__, final := true);
4309}
4310
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004311/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4312 * downgraded to CS1-4 so that GPRS can read the USF).
4313 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4314 */
4315testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4316 var PCUIF_info_ind info_ind;
4317 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4318 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004319 var uint32_t sched_fn, dl_fn, ack_fn;
4320 var octetstring data := f_rnd_octstring(10);
4321 var RlcmacDlBlock dl_block;
4322 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004323 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004324 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4325 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4326
4327 /* Initialize NS/BSSGP side */
4328 f_init_bssgp();
4329 /* Initialize GPRS MS side */
4330 f_init_gprs_ms(num_ms);
4331
4332 info_ind := valueof(ts_PCUIF_INFO_default);
4333 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004334 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4335 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004336
4337 /* Initialize the PCU interface abstraction */
4338 f_init_raw(testcasename(), info_ind);
4339
4340 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4341 g_mcs_initial_dl := 5;
4342 g_mcs_max_dl := 5;
4343 f_pcuvty_set_allowed_cs_mcs();
4344
4345 /* Establish BSSGP connection to the PCU */
4346 f_bssgp_establish();
4347 f_multi_ms_bssgp_register();
4348
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004349 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004350 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 +01004351 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4352 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4353 f_shutdown(__BFILE__, __LINE__);
4354 }
4355 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4356 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4357
4358 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004359 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 +01004360 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4361 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4362 f_shutdown(__BFILE__, __LINE__);
4363 }
4364 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4365 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4366
4367 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4368 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4369 f_sleep(0.1);
4370 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4371 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4372 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4373 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4374 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4375 /* ACK the DL block */
4376 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4377 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4378 f_dl_block_ack_fn(dl_block, dl_fn));
4379
4380 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4381 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4382 f_sleep(0.1);
4383 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4384 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4385 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4386 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4387 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4388 /* ACK the DL block */
4389 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4390 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4391 f_dl_block_ack_fn(dl_block, dl_fn));
4392
4393 data := f_rnd_octstring(1400);
4394 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4395 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4396
4397 for (var integer i := 0; i < 800; i := i + 1) {
4398 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4399
4400 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4401 /* No more data to receive, done */
4402 break;
4403 }
4404
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004405 usf_ms := -1;
4406
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004407 if (ischosen(dl_block.ctrl)) {
4408 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4409 f_shutdown(__BFILE__, __LINE__);
4410 } else if (ischosen(dl_block.data_egprs)) {
4411 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4412 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4413 f_shutdown(__BFILE__, __LINE__);
4414 }
4415 tgt_ms := 1;
4416 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4417 if (dl_block.data_egprs.mcs > MCS_4) {
4418 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4419 f_shutdown(__BFILE__, __LINE__);
4420 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004421 usf_ms := 0;
4422 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004423 } else {
4424 if (dl_block.data_egprs.mcs <= MCS_4) {
4425 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4426 f_shutdown(__BFILE__, __LINE__);
4427 }
4428 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004429 usf_ms := 1;
4430 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004431 }
4432 }
4433 } else {
4434 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4435 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4436 f_shutdown(__BFILE__, __LINE__);
4437 }
4438 tgt_ms := 0;
4439 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 +01004440 usf_ms := 0;
4441 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004442 } 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 +01004443 usf_ms := 1;
4444 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004445 }
4446 }
4447
4448 /* Keep Ack/Nack description updated */
4449 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4450
4451 /* TDMA frame number on which we are supposed to send the ACK */
4452 if (f_dl_block_rrbp_valid(dl_block)) {
4453 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4454 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);
4455 if (tx_data_remain != 0) {
4456 /* Submit more data from time to time to keep the TBF ongoing */
4457 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4458 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4459 tx_data_remain := tx_data_remain - 1;
4460 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004461 } else if (tx_data_remain != 0) {
4462 /* keep sending UL blocks when requested by USF to avoid
4463 * UL TBF timeout and hence stop receival of USFs */
4464 if (usf_ms != -1) {
4465 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4466 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004467 }
4468 }
4469
4470 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 +01004471 /* He we check that DL blocks scheduled at GPRS can still request UL
4472 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4473 * condition also ensures the downgrade to <=MCS4 condition is tested
4474 * above */
4475 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4476 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004477 f_shutdown(__BFILE__, __LINE__);
4478 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004479 /* Here check for some level of fairness between them (at least ~40%): */
4480 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4481 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4482 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4483 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4484 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4485 f_shutdown(__BFILE__, __LINE__);
4486 }
4487 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4488 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4489 f_shutdown(__BFILE__, __LINE__);
4490 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004491
4492 f_shutdown(__BFILE__, __LINE__, final := true);
4493}
4494
4495
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004496private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4497 boolean exp_imsi, boolean exp_tmsi)
4498runs on RAW_PCU_Test_CT {
4499 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4500 var integer pending := lengthof(g_ms);
4501 var RlcmacDlBlock dl_block;
4502 var boolean f1, f2;
4503
4504 while (pending > 0) {
4505 var uint32_t poll_fn;
4506
4507 /* Obtain a Downlink block and make sure it is a paging request */
4508 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4509 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4510 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4511 break;
4512 }
4513
4514 /* This should not happen in general, but who knows... */
4515 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4516 if (not ispresent(req.repeated_pageinfo)) {
4517 setverdict(fail, "Repeated Page Info IE is absent?!?");
4518 break;
4519 }
4520
4521 /* A single message may contain several MIs depending on their type */
4522 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4523 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4524 ps_domain := false);
4525 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4526 ps_domain := false);
4527 if (not f1 and not f2)
4528 { continue; }
4529
4530 /* Detect duplicate MIs */
4531 if (mask[i] == '1'B) {
4532 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4533 continue;
4534 }
4535
4536 mask[i] := '1'B;
4537 }
4538
4539 pending := pending - lengthof(req.repeated_pageinfo);
4540 }
4541
4542 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4543 if (mask[i] != '1'B) {
4544 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4545 log("===== mask := ", mask);
4546 }
4547 }
4548
4549 /* All messages must have been received by now, expect a dummy block */
4550 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4551}
4552
4553private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4554runs on RAW_PCU_Test_CT {
4555 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4556 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4557
4558 /* Initialize NS/BSSGP side */
4559 f_init_bssgp();
4560
4561 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004562 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004563
4564 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4565 f_init_gprs_ms(7 * 8);
4566
4567 /* Initialize the PCU interface abstraction */
4568 f_init_raw(testcasename(), info_ind);
4569
4570 /* Establish BSSGP connection to the PCU */
4571 f_bssgp_establish();
4572 f_multi_ms_bssgp_register();
4573
4574 /* Establish an Uplink TBF for each GprsMS instance */
4575 f_multi_ms_establish_tbf(do_activate := true);
4576}
4577
4578testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4579 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4580
4581 /* Common part: send INFO.ind, establish TBFs... */
4582 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4583
4584 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4585 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4586 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4587 }
4588
4589 /* FIXME: work around a race condition between PCUIF and BSSGP */
4590 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4591
4592 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4593 * The IUT is expected to page on all PDCH slots of all transceivers. */
4594 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4595 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4596 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4597 }
4598
4599 f_shutdown(__BFILE__, __LINE__, final := true);
4600}
4601
4602testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4603 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4604
4605 /* Common part: send INFO.ind, establish TBFs... */
4606 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4607
4608 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4609 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4610 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4611 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4612 }
4613
4614 /* FIXME: work around a race condition between PCUIF and BSSGP */
4615 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4616
4617 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4618 * The IUT is expected to page on all PDCH slots of all transceivers. */
4619 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4620 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4621 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4622 }
4623
4624 f_shutdown(__BFILE__, __LINE__, final := true);
4625}
4626
4627testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4628 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4629
4630 /* Common part: send INFO.ind, establish TBFs... */
4631 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4632
4633 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4634 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4635 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4636 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4637 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4638 } else {
4639 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4640 }
4641 }
4642
4643 /* FIXME: work around a race condition between PCUIF and BSSGP */
4644 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4645
4646 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4647 * The IUT is expected to page on all PDCH slots of all transceivers. */
4648 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4649 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4650 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4651 }
4652
4653 f_shutdown(__BFILE__, __LINE__, final := true);
4654}
4655
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004656private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004657runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4658 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004659 var integer i := 0;
4660 while (true) {
4661 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4662 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4663 break;
4664 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004665 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004666 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4667 f_shutdown(__BFILE__, __LINE__);
4668 }
4669 i := i + 1;
4670 }
4671 return dl_block;
4672}
4673
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004674private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4675runs on RAW_PCU_Test_CT {
4676 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),
4677 info_ind.lac),
4678 info_ind.rac),
4679 info_ind.cell_id));
4680 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4681 423),
4682 2),
4683 5));
4684 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4685 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4686 var template (value) RAN_Information_RIM_Container res_cont :=
4687 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4688 ts_RIM_Sequence_Number(2),
4689 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4690 ts_RIM_Protocol_Version_Number(1),
4691 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4692 omit);
4693 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4694 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4695 res_cont));
4696}
4697
4698altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4699runs on RAW_PCU_Test_CT {
4700 /* RIM procedure: */
4701 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),
4702 info_ind.lac),
4703 info_ind.rac),
4704 info_ind.cell_id));
4705 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4706 423),
4707 2),
4708 5));
4709 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4710 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4711 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4712 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4713 tr_RAN_Information_Request_RIM_Container)) {
4714 if (do_answer) {
4715 f_outbound_nacc_rim_tx_resp(info_ind);
4716 }
4717 if (do_repeat) {
4718 repeat;
4719 }
4720 }
4721}
4722
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004723private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
4724 boolean answer := true, boolean use_old_ctrl_iface := false)
4725runs on RAW_PCU_Test_CT {
4726 if (use_old_ctrl_iface == true) {
4727 f_ipa_ctrl_wait_link_up();
4728 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4729 int2str(info_ind.lac) & "." &
4730 int2str(info_ind.cell_id) & "." &
4731 int2str(req_arfcn) & "." &
4732 int2str(req_bsic);
4733 if (answer) {
4734 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4735 } else {
4736 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4737 }
4738 } else {
4739 var PCUIF_Message pcu_msg;
4740 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
4741 if (answer) {
4742 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
4743 }
4744 }
4745}
4746
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004747/* Start NACC from MS side */
4748private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004749 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004750 boolean skip_final_ctrl_ack := false,
4751 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004752runs on RAW_PCU_Test_CT {
4753 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4754 var RlcmacDlBlock dl_block;
4755 var uint32_t sched_fn;
4756 var GsmArfcn req_arfcn := 862;
4757 var uint6_t req_bsic := 43;
4758
4759 /* Start NACC from MS side */
4760 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4761 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4762
4763 if (exp_rac_ci_query == true) {
4764 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004765 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 +01004766 }
4767
4768 if (exp_si_query == true) {
4769 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004770 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004771 }
4772
4773 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004774 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004775
4776 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4777 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4778 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4779 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4780 f_shutdown(__BFILE__, __LINE__);
4781 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004782 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004783 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004784 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4785 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4786 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004787}
4788
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004789/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4790testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004791 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004792 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004793 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004794 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004795
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004796 if (use_old_ctrl_iface) {
4797 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4798 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4799 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004800
4801 /* Initialize NS/BSSGP side */
4802 f_init_bssgp();
4803 /* Initialize GPRS MS side */
4804 f_init_gprs_ms();
4805 ms := g_ms[0]; /* We only use first MS in this test */
4806
4807 /* Initialize the PCU interface abstraction */
4808 f_init_raw(testcasename(), info_ind);
4809
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004810 /* Make sure we are not affected by full cache from previous tests */
4811 f_pcuvty_flush_neigh_caches();
4812
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004813 /* Establish BSSGP connection to the PCU */
4814 f_bssgp_establish();
4815 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4816
4817 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004818 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 +01004819 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4820 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4821
4822 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004823 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004824
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004825 f_shutdown(__BFILE__, __LINE__, final := true);
4826}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004827
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004828/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4829testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4830 var PollFnCtx pollctx;
4831 var GprsMS ms;
4832 var RlcmacDlBlock dl_block;
4833 var uint32_t sched_fn;
4834 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004835 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004836
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004837 if (use_old_ctrl_iface) {
4838 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4839 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4840 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004841
4842 /* Initialize NS/BSSGP side */
4843 f_init_bssgp();
4844 /* Initialize GPRS MS side */
4845 f_init_gprs_ms();
4846 ms := g_ms[0]; /* We only use first MS in this test */
4847
4848 /* Initialize the PCU interface abstraction */
4849 f_init_raw(testcasename(), info_ind);
4850
4851 /* Make sure we are not affected by full cache from previous tests */
4852 f_pcuvty_flush_neigh_caches();
4853
4854 /* Establish BSSGP connection to the PCU */
4855 f_bssgp_establish();
4856 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4857
4858 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004859 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 +01004860 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4861 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4862
4863 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004864 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 +01004865
4866 /* Wait until we receive something non-dummy */
4867 dl_block := f_skip_dummy(0, sched_fn);
4868 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4869 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4870 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4871 }
4872 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4873 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4874 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4875 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4876 }
4877
4878 f_shutdown(__BFILE__, __LINE__, final := true);
4879}
4880
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004881/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4882testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4883 var PollFnCtx pollctx;
4884 var GprsMS ms;
4885 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004886 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004887 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004888
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004889 if (use_old_ctrl_iface) {
4890 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4891 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4892 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004893
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004894 /* Initialize NS/BSSGP side */
4895 f_init_bssgp();
4896 /* Initialize GPRS MS side */
4897 f_init_gprs_ms();
4898 ms := g_ms[0]; /* We only use first MS in this test */
4899
4900 /* Initialize the PCU interface abstraction */
4901 f_init_raw(testcasename(), info_ind);
4902
4903 /* Make sure we are not affected by full cache from previous tests */
4904 f_pcuvty_flush_neigh_caches();
4905 /* Set timeout values for caches so that entries will be in cache during second try */
4906 f_pcuvty_set_neigh_caches(10, 10);
4907
4908 /* Establish BSSGP connection to the PCU */
4909 f_bssgp_establish();
4910 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4911
4912 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004913 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 +01004914 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4915 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4916
4917 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004918 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004919
4920 /* 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 +02004921 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 +01004922
4923 f_shutdown(__BFILE__, __LINE__, final := true);
4924}
4925
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004926/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4927 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4928 */
4929testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4930 var PollFnCtx pollctx;
4931 var GprsMS ms;
4932 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004933 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004934 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004935
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004936 if (use_old_ctrl_iface) {
4937 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4938 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4939 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004940
4941 /* Initialize NS/BSSGP side */
4942 f_init_bssgp();
4943 /* Initialize GPRS MS side */
4944 f_init_gprs_ms();
4945 ms := g_ms[0]; /* We only use first MS in this test */
4946
4947 /* Initialize the PCU interface abstraction */
4948 f_init_raw(testcasename(), info_ind);
4949
4950 /* Make sure we are not affected by full cache from previous tests */
4951 f_pcuvty_flush_neigh_caches();
4952 /* Set timeout values for caches so that entries will be erased before the second try */
4953 f_pcuvty_set_neigh_caches(1, 1);
4954
4955 /* Establish BSSGP connection to the PCU */
4956 f_bssgp_establish();
4957 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4958
4959 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004960 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 +01004961 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4962 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4963
4964 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004965 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004966
4967 /* CTRL client should have disconnected from us */
4968 f_ipa_ctrl_wait_link_down();
4969 /* wait for cache entries to time out */
4970 f_sleep(2.0);
4971 /* 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 +02004972 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004973
4974 f_shutdown(__BFILE__, __LINE__, final := true);
4975}
4976
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004977/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004978testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4979 var RlcmacDlBlock dl_block;
4980 var PollFnCtx pollctx;
4981 var uint32_t sched_fn;
4982 var GprsMS ms;
4983 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4984 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004985 var GsmArfcn req_arfcn := 862;
4986 var uint6_t req_bsic := 43;
4987
4988 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4989 * resolution CTRL port, to trigger Conn Refused by socket:
4990 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4991 */
4992
4993 /* Initialize NS/BSSGP side */
4994 f_init_bssgp();
4995 /* Initialize GPRS MS side */
4996 f_init_gprs_ms();
4997 ms := g_ms[0]; /* We only use first MS in this test */
4998
4999 /* Initialize the PCU interface abstraction */
5000 f_init_raw(testcasename(), info_ind);
5001
5002 /* Make sure we are not affected by full cache from previous tests */
5003 f_pcuvty_flush_neigh_caches();
5004
5005 /* Establish BSSGP connection to the PCU */
5006 f_bssgp_establish();
5007 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5008
5009 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005010 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 +01005011 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5012 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5013
5014 /* Start NACC from MS side */
5015 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5016 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5017
5018 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005019 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005020 /* Make sure it is a Pkt Cell Chg Continue */
5021 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5022 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5023 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005024 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5025 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5026 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5027 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5028 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005029
5030 f_shutdown(__BFILE__, __LINE__, final := true);
5031}
5032
5033/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005034testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5035 var RlcmacDlBlock dl_block;
5036 var PollFnCtx pollctx;
5037 var uint32_t sched_fn;
5038 var GprsMS ms;
5039 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5040 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005041 var GsmArfcn req_arfcn := 862;
5042 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005043 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005044
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005045 if (use_old_ctrl_iface) {
5046 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5047 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5048 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005049
5050 /* Initialize NS/BSSGP side */
5051 f_init_bssgp();
5052 /* Initialize GPRS MS side */
5053 f_init_gprs_ms();
5054 ms := g_ms[0]; /* We only use first MS in this test */
5055
5056 /* Initialize the PCU interface abstraction */
5057 f_init_raw(testcasename(), info_ind);
5058
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005059 /* Make sure we are not affected by full cache from previous tests */
5060 f_pcuvty_flush_neigh_caches();
5061
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005062 /* Establish BSSGP connection to the PCU */
5063 f_bssgp_establish();
5064 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5065
5066 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005067 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 +01005068 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5069 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5070
5071 /* Start NACC from MS side */
5072 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5073 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5074
5075 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005076 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005077 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 +01005078
5079 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005080 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005081 /* Make sure it is a Pkt Cell Chg Continue */
5082 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5083 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5084 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005085 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5086 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5087 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5088 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5089 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005090
5091 f_shutdown(__BFILE__, __LINE__, final := true);
5092}
5093
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005094/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5095testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5096 var RlcmacDlBlock dl_block;
5097 var PollFnCtx pollctx;
5098 var uint32_t sched_fn;
5099 var GprsMS ms;
5100 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5101 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005102 var GsmArfcn req_arfcn := 862;
5103 var uint6_t req_bsic := 43;
5104
5105 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5106 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5107
5108 /* Initialize NS/BSSGP side */
5109 f_init_bssgp();
5110 /* Initialize GPRS MS side */
5111 f_init_gprs_ms();
5112 ms := g_ms[0]; /* We only use first MS in this test */
5113
5114 /* Initialize the PCU interface abstraction */
5115 f_init_raw(testcasename(), info_ind);
5116
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005117 /* Make sure we are not affected by full cache from previous tests */
5118 f_pcuvty_flush_neigh_caches();
5119
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005120 /* Establish BSSGP connection to the PCU */
5121 f_bssgp_establish();
5122 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5123
5124 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005125 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 +01005126 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5127 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5128
5129 /* Start NACC from MS side */
5130 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5131 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5132
5133 /* osmo-pcu should now ask for resolution: */
5134 f_ipa_ctrl_wait_link_up();
5135 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5136 int2str(info_ind.lac) & "." &
5137 int2str(info_ind.cell_id) & "." &
5138 int2str(req_arfcn) & "." &
5139 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005140 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005141 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5142
5143 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005144 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005145 /* Make sure it is a Pkt Cell Chg Continue */
5146 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5147 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5148 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005149 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5150 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5151 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5152 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5153 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005154
5155 f_shutdown(__BFILE__, __LINE__, final := true);
5156}
5157
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005158/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5159testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5160 var RlcmacDlBlock dl_block;
5161 var PollFnCtx pollctx;
5162 var uint32_t sched_fn;
5163 var GprsMS ms;
5164 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5165 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005166 var GsmArfcn req_arfcn := 862;
5167 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005168 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005169 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 */
5170 info_ind.lac),
5171 info_ind.rac),
5172 info_ind.cell_id));
5173 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5174 423),
5175 2),
5176 5));
5177 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5178 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5179
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005180 if (use_old_ctrl_iface) {
5181 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5182 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5183 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005184
5185 /* Initialize NS/BSSGP side */
5186 f_init_bssgp();
5187 /* Initialize GPRS MS side */
5188 f_init_gprs_ms();
5189 ms := g_ms[0]; /* We only use first MS in this test */
5190
5191 /* Initialize the PCU interface abstraction */
5192 f_init_raw(testcasename(), info_ind);
5193
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005194 /* Make sure we are not affected by full cache from previous tests */
5195 f_pcuvty_flush_neigh_caches();
5196
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005197 /* Establish BSSGP connection to the PCU */
5198 f_bssgp_establish();
5199 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5200
5201 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005202 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 +01005203 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5204 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5205
5206 /* Start NACC from MS side */
5207 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5208 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5209
5210 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005211 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 +01005212
5213 /* RIM procedure: */
5214 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5215 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5216 tr_RAN_Information_Request_RIM_Container));
5217 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5218
5219 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005220 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005221 /* Make sure it is a Pkt Cell Chg Continue */
5222 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5223 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5224 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005225 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5226 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5227 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5228 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5229 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005230
5231 f_shutdown(__BFILE__, __LINE__, final := true);
5232}
5233
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005234/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5235testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5236 var PollFnCtx pollctx;
5237 var GprsMS ms;
5238 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5239 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5240 var RlcmacDlBlock dl_block;
5241 var uint32_t sched_fn;
5242 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005243 var charstring ctrl_var;
5244 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005245 var GsmArfcn req_arfcn := 862;
5246 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005247 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005248
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005249 if (use_old_ctrl_iface) {
5250 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5251 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5252 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005253
5254 /* Initialize NS/BSSGP side */
5255 f_init_bssgp();
5256 /* Initialize GPRS MS side */
5257 f_init_gprs_ms();
5258 ms := g_ms[0]; /* We only use first MS in this test */
5259
5260 /* Initialize the PCU interface abstraction */
5261 f_init_raw(testcasename(), info_ind);
5262
5263 /* Make sure we are not affected by full cache from previous tests */
5264 f_pcuvty_flush_neigh_caches();
5265
5266 /* Establish BSSGP connection to the PCU */
5267 f_bssgp_establish();
5268 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5269
5270 /* Send PACKET RESOURCE REQUEST */
5271 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5272 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5273 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5274
5275 /* Start NACC from MS side */
5276 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5277 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5278
5279 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005280 if (use_old_ctrl_iface) {
5281 f_ipa_ctrl_wait_link_up();
5282 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5283 int2str(info_ind.lac) & "." &
5284 int2str(info_ind.cell_id) & "." &
5285 int2str(req_arfcn) & "." &
5286 int2str(req_bsic);
5287 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5288 } else {
5289 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5290 }
5291
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005292 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5293 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5294 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005295
5296 if (use_old_ctrl_iface) {
5297 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5298 } else {
5299 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5300 }
5301
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005302 timer T := 2.0;
5303 T.start;
5304 alt {
5305 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005306 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005307 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5308 f_shutdown(__BFILE__, __LINE__);
5309 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005310 [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 {
5311 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5312 f_shutdown(__BFILE__, __LINE__);
5313 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005314 [] T.timeout {
5315 setverdict(pass);
5316 }
5317 }
5318
5319 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005320 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005321
5322 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5323 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5324 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5325 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5326 f_shutdown(__BFILE__, __LINE__);
5327 }
5328 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5329 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5330 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5331 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5332 }
5333
5334 f_shutdown(__BFILE__, __LINE__, final := true);
5335}
5336
5337/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5338testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5339 var PollFnCtx pollctx;
5340 var GprsMS ms;
5341 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5342 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5343 var RlcmacDlBlock dl_block;
5344 var uint32_t sched_fn;
5345 var CtrlMessage rx_ctrl;
5346 var GsmArfcn req_arfcn := 862;
5347 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005348 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005349
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005350 if (use_old_ctrl_iface) {
5351 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5352 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5353 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005354
5355 /* Initialize NS/BSSGP side */
5356 f_init_bssgp();
5357 /* Initialize GPRS MS side */
5358 f_init_gprs_ms();
5359 ms := g_ms[0]; /* We only use first MS in this test */
5360
5361 /* Initialize the PCU interface abstraction */
5362 f_init_raw(testcasename(), info_ind);
5363
5364 /* Make sure we are not affected by full cache from previous tests */
5365 f_pcuvty_flush_neigh_caches();
5366
5367 /* Establish BSSGP connection to the PCU */
5368 f_bssgp_establish();
5369 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5370
5371 /* Send PACKET RESOURCE REQUEST */
5372 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5373 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5374 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5375
5376 /* Start NACC from MS side */
5377 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5378 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5379
5380 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005381 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 +01005382 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5383 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5384 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5385 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5386 f_outbound_nacc_rim_tx_resp(info_ind);
5387 timer T := 1.0;
5388 T.start;
5389 alt {
5390 [] RIM.receive {
5391 setverdict(fail, "Received unexpected RIM message");
5392 f_shutdown(__BFILE__, __LINE__);
5393 }
5394 [] T.timeout {
5395 setverdict(pass);
5396 }
5397 }
5398
5399 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005400 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005401
5402 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5403 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5404 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5405 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5406 f_shutdown(__BFILE__, __LINE__);
5407 }
5408 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5409 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5410 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5411 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5412 }
5413
5414 f_shutdown(__BFILE__, __LINE__, final := true);
5415}
5416
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005417/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5418testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5419 var PollFnCtx pollctx;
5420 var GprsMS ms;
5421 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5422 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5423 var RlcmacDlBlock dl_block;
5424 var uint32_t sched_fn;
5425 var CtrlMessage rx_ctrl;
5426 var GsmArfcn req_arfcn := 862;
5427 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005428 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005429
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005430 if (use_old_ctrl_iface) {
5431 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5432 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5433 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005434
5435 /* Initialize NS/BSSGP side */
5436 f_init_bssgp();
5437 /* Initialize GPRS MS side */
5438 f_init_gprs_ms();
5439 ms := g_ms[0]; /* We only use first MS in this test */
5440
5441 /* Initialize the PCU interface abstraction */
5442 f_init_raw(testcasename(), info_ind);
5443
5444 /* Make sure we are not affected by full cache from previous tests */
5445 f_pcuvty_flush_neigh_caches();
5446
5447 /* Establish BSSGP connection to the PCU */
5448 f_bssgp_establish();
5449 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5450
5451 /* Send PACKET RESOURCE REQUEST */
5452 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5453 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5454 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5455
5456 /* Start NACC from MS side */
5457 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5458 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5459
5460 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005461 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 +01005462 /* RIM procedure: */
5463 as_outbound_nacc_rim_resolve(info_ind);
5464
5465 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5466 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5467 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5468
5469 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5470 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5471
5472 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5473 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5474 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5475 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5476 f_shutdown(__BFILE__, __LINE__);
5477 }
5478 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5479 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5480 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5481 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5482 }
5483}
5484
5485/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5486testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5487 var PollFnCtx pollctx;
5488 var GprsMS ms;
5489 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5490 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5491 var RlcmacDlBlock dl_block;
5492 var uint32_t sched_fn;
5493 var CtrlMessage rx_ctrl;
5494 var GsmArfcn req_arfcn := 862;
5495 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005496 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005497
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005498 if (use_old_ctrl_iface) {
5499 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5500 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5501 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005502
5503 /* Initialize NS/BSSGP side */
5504 f_init_bssgp();
5505 /* Initialize GPRS MS side */
5506 f_init_gprs_ms();
5507 ms := g_ms[0]; /* We only use first MS in this test */
5508
5509 /* Initialize the PCU interface abstraction */
5510 f_init_raw(testcasename(), info_ind);
5511
5512 /* Make sure we are not affected by full cache from previous tests */
5513 f_pcuvty_flush_neigh_caches();
5514
5515 /* Establish BSSGP connection to the PCU */
5516 f_bssgp_establish();
5517 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5518
5519 /* Send PACKET RESOURCE REQUEST */
5520 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5521 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5522 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5523
5524 /* Start NACC from MS side */
5525 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5526 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5527
5528 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005529 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 +01005530 /* RIM procedure: */
5531 as_outbound_nacc_rim_resolve(info_ind);
5532
5533 /* Announce SI back to MS, continue NACC procedure */
5534 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5535
5536 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5537 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5538
5539 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5540 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5541 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5542 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5543 f_shutdown(__BFILE__, __LINE__);
5544 }
5545 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5546 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5547 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5548 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5549 }
5550}
5551
5552/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5553testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5554 var PollFnCtx pollctx;
5555 var GprsMS ms;
5556 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5557 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5558 var RlcmacDlBlock dl_block;
5559 var uint32_t sched_fn;
5560 var CtrlMessage rx_ctrl;
5561 var GsmArfcn req_arfcn := 862;
5562 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005563 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005564
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005565 if (use_old_ctrl_iface) {
5566 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5567 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5568 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005569
5570 /* Initialize NS/BSSGP side */
5571 f_init_bssgp();
5572 /* Initialize GPRS MS side */
5573 f_init_gprs_ms();
5574 ms := g_ms[0]; /* We only use first MS in this test */
5575
5576 /* Initialize the PCU interface abstraction */
5577 f_init_raw(testcasename(), info_ind);
5578
5579 /* Make sure we are not affected by full cache from previous tests */
5580 f_pcuvty_flush_neigh_caches();
5581
5582 /* Establish BSSGP connection to the PCU */
5583 f_bssgp_establish();
5584 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5585
5586 /* Send PACKET RESOURCE REQUEST */
5587 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5588 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5589 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5590
5591 /* Start NACC from MS side */
5592 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5593 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5594
5595 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005596 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 +01005597 /* RIM procedure: */
5598 as_outbound_nacc_rim_resolve(info_ind);
5599
5600 /* Announce SI back to MS, continue NACC procedure */
5601 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5602
5603 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5604 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5605 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5606 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5607 f_shutdown(__BFILE__, __LINE__);
5608 }
5609 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5610 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5611
5612 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5613 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5614 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5615 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5616 }
5617}
5618
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005619/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5620 * while waiting for CTRL resolution */
5621testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5622 var PollFnCtx pollctx;
5623 var GprsMS ms;
5624 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5625 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5626 var RlcmacDlBlock dl_block;
5627 var uint32_t sched_fn;
5628 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005629 var charstring ctrl_var;
5630 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005631 var GsmArfcn req_arfcn := 862;
5632 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005633 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005634
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005635 if (use_old_ctrl_iface) {
5636 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5637 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5638 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005639
5640 /* Initialize NS/BSSGP side */
5641 f_init_bssgp();
5642 /* Initialize GPRS MS side */
5643 f_init_gprs_ms();
5644 ms := g_ms[0]; /* We only use first MS in this test */
5645
5646 /* Initialize the PCU interface abstraction */
5647 f_init_raw(testcasename(), info_ind);
5648
5649 /* Make sure we are not affected by full cache from previous tests */
5650 f_pcuvty_flush_neigh_caches();
5651
5652 /* Establish BSSGP connection to the PCU */
5653 f_bssgp_establish();
5654 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5655
5656 /* Send PACKET RESOURCE REQUEST */
5657 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5658 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5659 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5660
5661 /* Start NACC from MS side */
5662 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5663 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5664
5665 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005666 if (use_old_ctrl_iface) {
5667 f_ipa_ctrl_wait_link_up();
5668 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5669 int2str(info_ind.lac) & "." &
5670 int2str(info_ind.cell_id) & "." &
5671 int2str(req_arfcn) & "." &
5672 int2str(req_bsic);
5673 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5674 } else {
5675 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5676 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005677 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5678 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5679 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5680 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005681 if (use_old_ctrl_iface) {
5682 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5683 } else {
5684 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5685 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005686 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005687 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005688
5689 /* And finally everything continues as usual with RIN procedure */
5690 as_outbound_nacc_rim_resolve(info_ind);
5691
5692 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005693 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005694
5695 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5696 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5697 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5698 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5699 f_shutdown(__BFILE__, __LINE__);
5700 }
5701 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5702 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5703 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5704 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5705 }
5706
5707 f_shutdown(__BFILE__, __LINE__, final := true);
5708}
5709
5710/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5711 * while waiting for SI resolution */
5712testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5713 var PollFnCtx pollctx;
5714 var GprsMS ms;
5715 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5716 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5717 var RlcmacDlBlock dl_block;
5718 var uint32_t sched_fn;
5719 var CtrlMessage rx_ctrl;
5720 var GsmArfcn req_arfcn := 862;
5721 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005722 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005723
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005724 if (use_old_ctrl_iface) {
5725 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5726 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5727 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005728
5729 /* Initialize NS/BSSGP side */
5730 f_init_bssgp();
5731 /* Initialize GPRS MS side */
5732 f_init_gprs_ms();
5733 ms := g_ms[0]; /* We only use first MS in this test */
5734
5735 /* Initialize the PCU interface abstraction */
5736 f_init_raw(testcasename(), info_ind);
5737
5738 /* Make sure we are not affected by full cache from previous tests */
5739 f_pcuvty_flush_neigh_caches();
5740
5741 /* Establish BSSGP connection to the PCU */
5742 f_bssgp_establish();
5743 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5744
5745 /* Send PACKET RESOURCE REQUEST */
5746 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5747 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5748 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5749
5750 /* Start NACC from MS side */
5751 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5752 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5753
5754 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005755 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 +01005756 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5757 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5758 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5759 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5760 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5761 f_outbound_nacc_rim_tx_resp(info_ind);
5762
5763 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005764 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 +01005765
5766 /* And finally everything continues as usual with RIN procedure */
5767 as_outbound_nacc_rim_resolve(info_ind);
5768
5769 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005770 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005771
5772 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5773 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5774 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5775 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5776 f_shutdown(__BFILE__, __LINE__);
5777 }
5778 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5779 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5780 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5781 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5782 }
5783
5784 f_shutdown(__BFILE__, __LINE__, final := true);
5785}
5786
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005787/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5788 * while sending Pkt Neigh Data Change */
5789testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5790 var PollFnCtx pollctx;
5791 var GprsMS ms;
5792 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5793 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5794 var RlcmacDlBlock dl_block;
5795 var uint32_t sched_fn;
5796 var CtrlMessage rx_ctrl;
5797 var GsmArfcn req_arfcn := 862;
5798 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005799 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005800
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005801 if (use_old_ctrl_iface) {
5802 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5803 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5804 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005805
5806 /* Initialize NS/BSSGP side */
5807 f_init_bssgp();
5808 /* Initialize GPRS MS side */
5809 f_init_gprs_ms();
5810 ms := g_ms[0]; /* We only use first MS in this test */
5811
5812 /* Initialize the PCU interface abstraction */
5813 f_init_raw(testcasename(), info_ind);
5814
5815 /* Make sure we are not affected by full cache from previous tests */
5816 f_pcuvty_flush_neigh_caches();
5817
5818 /* Establish BSSGP connection to the PCU */
5819 f_bssgp_establish();
5820 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5821
5822 /* Send PACKET RESOURCE REQUEST */
5823 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5824 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5825 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5826
5827 /* Start NACC from MS side */
5828 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5829 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5830
5831 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005832 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 +01005833 /* RIM procedure: */
5834 as_outbound_nacc_rim_resolve(info_ind);
5835
5836 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5837 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5838 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5839 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5840
5841 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005842 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 +01005843 /* RIM procedure: */
5844 as_outbound_nacc_rim_resolve(info_ind);
5845 /* Transmit SI back to MS */
5846 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5847
5848 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5849 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5850 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5851 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5852 f_shutdown(__BFILE__, __LINE__);
5853 }
5854 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5855 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5856 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5857 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5858 }
5859}
5860
5861/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5862testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5863 var PollFnCtx pollctx;
5864 var GprsMS ms;
5865 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5866 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5867 var RlcmacDlBlock dl_block;
5868 var uint32_t sched_fn;
5869 var CtrlMessage rx_ctrl;
5870 var GsmArfcn req_arfcn := 862;
5871 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005872 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005873
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005874 if (use_old_ctrl_iface) {
5875 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5876 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5877 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005878
5879 /* Initialize NS/BSSGP side */
5880 f_init_bssgp();
5881 /* Initialize GPRS MS side */
5882 f_init_gprs_ms();
5883 ms := g_ms[0]; /* We only use first MS in this test */
5884
5885 /* Initialize the PCU interface abstraction */
5886 f_init_raw(testcasename(), info_ind);
5887
5888 /* Make sure we are not affected by full cache from previous tests */
5889 f_pcuvty_flush_neigh_caches();
5890
5891 /* Establish BSSGP connection to the PCU */
5892 f_bssgp_establish();
5893 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5894
5895 /* Send PACKET RESOURCE REQUEST */
5896 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5897 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5898 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5899
5900 /* Start NACC from MS side */
5901 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5902 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5903
5904 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005905 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 +01005906 /* RIM procedure: */
5907 as_outbound_nacc_rim_resolve(info_ind);
5908
5909 /* Announce SI back to MS, continue NACC procedure */
5910 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5911
5912 /* trigger a Pkt Cell Change Notif with different tgt cell */
5913 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5914 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5915
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005916 /* It should trigger RAC_CI resolution to start again: */
5917 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
5918
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005919 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5920 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5921
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005922 /* RIM procedure: */
5923 as_outbound_nacc_rim_resolve(info_ind);
5924 /* Transmit SI back to MS */
5925 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5926
5927 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5928 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5929 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5930 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5931 f_shutdown(__BFILE__, __LINE__);
5932 }
5933 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5934 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5935 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5936 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5937 }
5938}
5939
5940/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5941testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5942 var PollFnCtx pollctx;
5943 var GprsMS ms;
5944 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5945 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5946 var RlcmacDlBlock dl_block;
5947 var uint32_t sched_fn;
5948 var CtrlMessage rx_ctrl;
5949 var GsmArfcn req_arfcn := 862;
5950 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005951 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005952
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005953 if (use_old_ctrl_iface) {
5954 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5955 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5956 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005957
5958 /* Initialize NS/BSSGP side */
5959 f_init_bssgp();
5960 /* Initialize GPRS MS side */
5961 f_init_gprs_ms();
5962 ms := g_ms[0]; /* We only use first MS in this test */
5963
5964 /* Initialize the PCU interface abstraction */
5965 f_init_raw(testcasename(), info_ind);
5966
5967 /* Make sure we are not affected by full cache from previous tests */
5968 f_pcuvty_flush_neigh_caches();
5969
5970 /* Establish BSSGP connection to the PCU */
5971 f_bssgp_establish();
5972 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5973
5974 /* Send PACKET RESOURCE REQUEST */
5975 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5976 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5977 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5978
5979 /* Start NACC from MS side */
5980 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5981 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5982
5983 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005984 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 +01005985 /* RIM procedure: */
5986 as_outbound_nacc_rim_resolve(info_ind);
5987
5988 /* Announce SI back to MS, continue NACC procedure */
5989 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5990
5991 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5992 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5993 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5994 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5995 f_shutdown(__BFILE__, __LINE__);
5996 }
5997
5998 /* trigger a Pkt Cell Change Notif with different tgt cell */
5999 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6000 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6001
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006002 /* It should trigger RAC_CI resolution to start again: */
6003 /* When using new PCUIF interface for resolution, we must
6004 * PCUIF.receive() here since that's the first message in the PCUIF
6005 * queue that PCU will have sent. Calling other functions doing
6006 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6007 * due to unexpected message receive. */
6008 if (not use_old_ctrl_iface) {
6009 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6010 }
6011
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006012 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6013 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6014 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6015 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6016 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006017
6018 /* When using CTRL interface, we must schedule the ACK before (see
6019 * above) blocking here waiting for the resoltion, otherwise we'll be
6020 * too late scheduling by the time the resolution is done. */
6021 if (use_old_ctrl_iface) {
6022 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6023 }
6024
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006025 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6026 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6027
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006028 /* RIM procedure: */
6029 as_outbound_nacc_rim_resolve(info_ind);
6030 /* Transmit SI back to MS */
6031 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6032
6033 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6034 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6035 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6036 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6037 f_shutdown(__BFILE__, __LINE__);
6038 }
6039 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6040 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6041 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6042 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6043 }
6044}
6045
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006046/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6047testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6048 var PollFnCtx pollctx;
6049 var GprsMS ms;
6050 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6051 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6052 var RlcmacDlBlock dl_block;
6053 var uint32_t sched_fn, dl_fn;
6054 var CtrlMessage rx_ctrl;
6055 var GsmArfcn req_arfcn := 862;
6056 var uint6_t req_bsic := 43;
6057 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006058 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006059
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006060 if (use_old_ctrl_iface) {
6061 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6062 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6063 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006064
6065 /* Initialize NS/BSSGP side */
6066 f_init_bssgp();
6067 /* Initialize GPRS MS side */
6068 f_init_gprs_ms();
6069 ms := g_ms[0]; /* We only use first MS in this test */
6070
6071 /* Initialize the PCU interface abstraction */
6072 f_init_raw(testcasename(), info_ind);
6073
6074 /* Make sure we are not affected by full cache from previous tests */
6075 f_pcuvty_flush_neigh_caches();
6076
6077 /* Establish BSSGP connection to the PCU */
6078 f_bssgp_establish();
6079 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6080
6081 /* Send PACKET RESOURCE REQUEST */
6082 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6083 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6084 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6085
6086 /* Start NACC from MS side */
6087 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6088 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6089
6090 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006091 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 +01006092 /* RIM procedure: */
6093 as_outbound_nacc_rim_resolve(info_ind);
6094
6095 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6096 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6097 f_sleep(0.1);
6098 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6099 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6100
6101 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6102 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6103 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6104 * Data with unassigned DL TBF in line above): */
6105 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6106 /* Continue receiving Pkt Cell Neighbor Data */
6107 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6108
6109 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6110 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6111 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6112 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6113 f_shutdown(__BFILE__, __LINE__);
6114 }
6115 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6116 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6117 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6118 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6119 }
6120
6121 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6122 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6123 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6124 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6125 f_dl_block_ack_fn(dl_block, dl_fn));
6126}
6127
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006128
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006129function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6130runs on RAW_PCU_Test_CT
6131{
6132 var template (value) RAN_Information_Request_RIM_Container req_cont;
6133 var template (value) PDU_BSSGP bssgp_rim_pdu;
6134 var template PDU_BSSGP bssgp_rim_pdu_expect;
6135 var template RAN_Information_RIM_Container rim_cont_expect;
6136 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006137
6138 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006139 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 +01006140 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006141 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 +01006142 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006143 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);
6144 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006145 f_sleep(1.0);
6146
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006147 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006148
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006149 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6150 ts_RIM_Sequence_Number(1),
6151 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6152 ts_RIM_Protocol_Version_Number(1),
6153 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6154 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006155 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6156 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006157
6158 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6159 tr_RIM_Sequence_Number(1),
6160 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6161 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006162 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 +01006163 omit);
6164
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006165 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6166 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006167 rim_cont_expect);
6168 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006169 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006170 T.start;
6171 alt {
6172 [] RIM.receive(bssgp_rim_pdu_expect) { }
6173 [] RIM.receive {
6174 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6175 }
6176 [] T.timeout {
6177 setverdict(fail, "No BSSGP RIM PDU received");
6178 mtc.stop;
6179 }
6180 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006181}
6182/* Send a RIM RAN info request to the PCU and verify the response, we expect
6183 * getting the system information back which we have transfered to the PCU via
6184 * PCUIF on startup. */
6185testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6186 /* Initialize NS/BSSGP side */
6187 f_init_bssgp();
6188
6189 /* Initialize the PCU interface abstraction */
6190 f_init_raw(testcasename());
6191
6192 /* Establish BSSGP connection to the PCU */
6193 f_bssgp_establish();
6194
6195 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6196 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6197
6198 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6199 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6200
6201 f_shutdown(__BFILE__, __LINE__, final := true);
6202}
6203
6204/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6205 * Routing information, to verify PCU handles that kind of address just fine
6206 */
6207testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6208 /* Initialize NS/BSSGP side */
6209 f_init_bssgp();
6210
6211 /* Initialize the PCU interface abstraction */
6212 f_init_raw(testcasename());
6213
6214 /* Establish BSSGP connection to the PCU */
6215 f_bssgp_establish();
6216
6217 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6218 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6219
6220 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6221 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006222
6223 f_shutdown(__BFILE__, __LINE__, final := true);
6224}
6225
6226/* Same as above, but in this case we simulate the rare case in which the PCU
6227 * has no system information available. We expect getting a response back but
6228 * with no system information inside. */
6229testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006230 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006231 var PCUIF_Message pcu_msg;
6232 timer T := 2.0;
6233
6234 /* Initialize NS/BSSGP side */
6235 f_init_bssgp();
6236
6237 /* Initialize the PCU interface abstraction */
6238 f_init_raw(testcasename(), info_ind);
6239
6240 /* Establish BSSGP connection to the PCU */
6241 f_bssgp_establish();
6242
6243 /* Clear sysinfo from the PCU */
6244 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);
6245 BTS.send(si1_data_ind);
6246 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);
6247 BTS.send(si3_data_ind);
6248 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);
6249 BTS.send(si16_data_ind);
6250 f_sleep(1.0);
6251
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006252 var RIM_Routing_Address dst_addr;
6253 var RIM_Routing_Address src_addr;
6254 var template (value) RAN_Information_Request_RIM_Container req_cont;
6255 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006256 var template PDU_BSSGP bssgp_rim_pdu_expect;
6257 var template RAN_Information_RIM_Container rim_cont_expect;
6258
6259 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 +01006260 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6261 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006262
6263 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6264 ts_RIM_Sequence_Number(1),
6265 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6266 ts_RIM_Protocol_Version_Number(1),
6267 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6268 omit);
6269 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6270 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6271 req_cont);
6272
6273
6274 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6275 tr_RIM_Sequence_Number(1),
6276 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6277 tr_RIM_Protocol_Version_Number(1),
6278 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6279 omit);
6280
6281 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6282 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6283 rim_cont_expect);
6284 RIM.send(bssgp_rim_pdu);
6285 T.start;
6286 alt {
6287 [] RIM.receive(bssgp_rim_pdu_expect) { }
6288 [] RIM.receive {
6289 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6290 }
6291 [] T.timeout {
6292 setverdict(fail, "No BSSGP RIM PDU received");
6293 mtc.stop;
6294 }
6295 }
6296
6297 f_shutdown(__BFILE__, __LINE__, final := true);
6298}
6299
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006300/* 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 +02006301testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6302 var PCUIF_info_ind info_ind;
6303 var template (value) TsTrxBtsNum nr;
6304 var RlcmacDlBlock dl_block;
6305 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006306 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006307 timer T;
6308
6309 /* Initialize NS/BSSGP side */
6310 f_init_bssgp();
6311
6312 info_ind := valueof(ts_PCUIF_INFO_default);
6313 /* The 2 first TRX are enabled. */
6314 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6315 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6316 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6317
6318 /* Initialize the PCU interface abstraction */
6319 f_init_raw(testcasename(), info_ind);
6320
6321 /* Establish BSSGP connection to the PCU */
6322 f_bssgp_establish();
6323
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006324 for (ts := 0; ts < 2; ts := ts + 1) {
6325 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006326
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006327 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6328 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6329 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6330 T.start(0.5);
6331 alt {
6332 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6333 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6334 omit)) -> value data_msg {
6335 setverdict(pass);
6336 T.stop;
6337 }
6338 [] as_rx_fail_dummy(nr);
6339 [] BTS.receive {
6340 setverdict(fail, "Unexpected block from BTS");
6341 f_shutdown(__BFILE__, __LINE__);
6342 }
6343 [] T.timeout {
6344 setverdict(fail, "Expected IDLE block from BTS");
6345 f_shutdown(__BFILE__, __LINE__);
6346 }
6347 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006348 }
6349
6350 f_shutdown(__BFILE__, __LINE__, final := true);
6351}
6352
Oliver Smith3d174882021-09-03 11:38:51 +02006353/* Test stats for available and occupied PDCHs */
6354testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6355 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6356 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6357
6358 /* Initialize NS/BSSGP side */
6359 f_init_bssgp();
6360
Oliver Smithedcded22021-09-14 09:26:55 +02006361 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6362 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6363 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6364 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6365 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6366 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006367
Oliver Smith72d0c692021-09-08 10:03:52 +02006368 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006369 f_init_gprs_ms(4);
6370
6371 /* Initialize the PCU interface abstraction */
6372 f_init_raw(testcasename(), info_ind);
6373
6374 /* Reset stats */
6375 f_statsd_reset();
6376
6377 /* Establish BSSGP */
6378 f_bssgp_establish();
6379
6380 /* 8 PDCHs available, 0 occupied */
6381 var StatsDExpects expect := {
6382 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006383 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6384 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6385 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006386 };
6387 f_statsd_expect(expect);
6388
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006389 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006390 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006391 f_ms_establish_ul_tbf(g_ms[0]);
6392 f_ms_establish_ul_tbf(g_ms[1]);
6393 f_ms_establish_ul_tbf(g_ms[2]);
6394 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 +02006395
6396 /* 4 PDCHs occupied */
6397 expect := {
6398 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006399 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6400 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6401 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006402 };
6403 f_statsd_expect(expect);
6404
6405 f_shutdown(__BFILE__, __LINE__, final := true);
6406}
6407
Oliver Smithf04762d2021-09-14 17:20:38 +02006408/* Test stats for available and occupied PDCHs, for MS which is not known by
6409 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6410 * data arrives from SGSN) */
6411function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6412 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6413 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6414
6415 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6416 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6417 gprsmultislotclass := '00001'B,
6418 gprsextendeddynalloccap := '0'B
6419 };
6420 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6421 egprsmultislotclass := '00001'B,
6422 egprsextendeddynalloccap := '0'B
6423 };
6424 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6425 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6426 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6427 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6428
6429 /* Initialize NS/BSSGP side */
6430 f_init_bssgp();
6431
6432 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6433 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6434 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6435 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6436 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6437 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6438
6439 /* Allocate 1 GprsMS instance */
6440 f_init_gprs_ms(1);
6441
6442 /* Initialize the PCU interface abstraction */
6443 f_init_raw(testcasename(), info_ind);
6444
6445 /* Reset stats */
6446 f_statsd_reset();
6447
6448 /* Establish BSSGP */
6449 f_bssgp_establish();
6450
6451 /* 8 PDCHs available, 0 occupied */
6452 var StatsDExpects expect := {
6453 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6454 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6455 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6456 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6457 };
6458 f_statsd_expect(expect);
6459
6460 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6461 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6462
6463 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6464 var octetstring data := f_rnd_octstring(1400);
6465 if (egprs) {
6466 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6467 } else {
6468 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6469 }
6470 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6471
6472 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6473 f_sleep(X2002);
6474
6475 /* 1 PDCH occupied */
6476 if (egprs) {
6477 expect := {
6478 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6479 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6480 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6481 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6482 };
6483 } else {
6484 expect := {
6485 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6486 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6487 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6488 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6489 };
6490 }
6491 f_statsd_expect(expect);
6492
6493 /* Clean up */
6494 f_shutdown(__BFILE__, __LINE__, final := true);
6495}
6496testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6497 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6498}
6499testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6500 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6501}
6502
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006503control {
6504 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006505 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006506 execute( TC_ta_ptcch_idle() );
6507 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006508 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006509 execute( TC_ta_idle_dl_tbf_ass() );
6510 execute( TC_ta_ptcch_ul_multi_tbf() );
6511 execute( TC_cs_lqual_ul_tbf() );
6512 execute( TC_cs_initial_ul() );
6513 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006514 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006515 execute( TC_cs_max_dl() );
6516 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006517 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006518 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006519 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006520 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006521 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006522 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006523 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006524 execute( TC_x2031_t3191() );
6525 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006526 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006527 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006528 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006529 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006530 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006531 execute( TC_mo_ping_pong() );
6532 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006533 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006534 execute( TC_mt_ping_pong() );
6535 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006536 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006537 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006538 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006539 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006540 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006541 execute( TC_paging_cs_from_bts() );
6542 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6543 execute( TC_paging_cs_from_sgsn_sign() );
6544 execute( TC_paging_cs_from_sgsn_ptp() );
6545 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6546 execute( TC_paging_ps_from_sgsn_sign() );
6547 execute( TC_paging_ps_from_sgsn_ptp() );
Oliver Smithe1a77c42021-07-28 13:36:09 +02006548 if (mp_osmo_pcu_newer_than_0_9_0) {
6549 execute( TC_paging_pch_timeout() );
6550 }
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006551 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6552 execute( TC_paging_cs_multi_ms_imsi() );
6553 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006554 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6555 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006556 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6557 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006558
6559 /* EGPRS specific test cases */
6560 execute( TC_egprs_pkt_chan_req_signalling() );
6561 execute( TC_egprs_pkt_chan_req_one_phase() );
6562 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006563 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006564 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006565 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006566
6567 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006568
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006569 /* Immediate Assignment on AGCH/PCH */
6570 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6571 execute( TC_pcuif_fh_imm_ass_ul() );
6572 execute( TC_pcuif_fh_imm_ass_dl() );
6573 /* Packet Uplink/Downlink Assignment on PACCH */
6574 execute( TC_pcuif_fh_pkt_ass_ul() );
6575 execute( TC_pcuif_fh_pkt_ass_dl() );
6576 execute( TC_multitrx_multims_alloc() );
6577 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6578 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6579 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006580 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006581 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006582
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006583 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006584
6585 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006586 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006587 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006588 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006589 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006590 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006591 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006592 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6593 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006594 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6595 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6596 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006597 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6598 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006599 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6600 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6601 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006602 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006603 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6604 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6605 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6606 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006607
6608 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006609 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006610 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006611
6612 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006613
6614 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006615 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6616 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006617}
6618
Harald Weltea419df22019-03-21 17:23:04 +01006619}