blob: f77c4c1428c83a6c74b31a23575873c7f757fa9f [file] [log] [blame]
Harald Weltea0895f92018-03-08 11:51:23 +01001module PCU_Tests {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002
3/* "RAW" PCU tests: Talk directly to the PCU socket of OsmoPCU on the one hand side (emulating
4 the BTS/BSC side PCU socket server) and the Gb interface on the other hand side. No NS/BSSGP
5 Emulation is used; rather, we simply use the NS_CodecPort to implement both standard and non-
6 standard procedures on the NS and BSSGP level. The goal of these tests is to test exactly
7 those NS and BSSGP implementations on the BSS (PCU) side. */
8
9/* (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +070010 * (C) 2019-2020 Vadim Yanitskiy <axilirator@gmail.com>
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020011 * All rights reserved.
12 *
13 * Released under the terms of GNU General Public License, Version 2 or
14 * (at your option) any later version.
15 *
16 * SPDX-License-Identifier: GPL-2.0-or-later
17 */
18
19friend module PCU_Tests_NS;
20
21import from General_Types all;
22import from Osmocom_Types all;
23import from GSM_Types all;
24import from GSM_RR_Types all;
25
26import from Osmocom_VTY_Functions all;
27import from TELNETasp_PortType all;
28
29import from MobileL3_GMM_SM_Types all;
30import from RLCMAC_CSN1_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020031import from RLCMAC_CSN1_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020032import from RLCMAC_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020033import from RLCMAC_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020034
35import from MobileL3_CommonIE_Types all;
36import from L3_Templates all;
37
38import from NS_Types all;
39import from BSSGP_Types all;
40import from Osmocom_Gb_Types all;
41
42import from BSSGP_Emulation all; /* BssgpConfig */
43import from NS_Emulation all; /* NSConfiguration */
44
45import from UD_Types all;
46import from PCUIF_Types all;
47import from PCUIF_CodecPort all;
48import from PCUIF_Components all;
49import from IPL4asp_Types all;
50import from Native_Functions all;
51import from SGSN_Components all;
Pau Espin Pedrolaedc5112020-05-16 17:30:42 +020052import from GPRS_Components all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020053
Daniel Willmann535aea62020-09-21 13:27:08 +020054import from StatsD_Types all;
55import from StatsD_CodecPort all;
56import from StatsD_CodecPort_CtrlFunct all;
57import from StatsD_Checker all;
58
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010059import from IPA_Emulation all;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +010060import from Osmocom_CTRL_Types all;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010061import from Osmocom_CTRL_Adapter all;
62import from Osmocom_CTRL_Functions all;
63
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020064modulepar {
65 charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;
66
67 float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */
Daniel Willmann535aea62020-09-21 13:27:08 +020068
69 charstring mp_pcu_statsd_ip := "127.0.0.1";
70 integer mp_pcu_statsd_port := 8125;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010071
72 charstring mp_ctrl_neigh_ip := "127.0.0.1";
73 integer mp_ctrl_neigh_port := 4248;
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);
400 var RlcmacDlBlock dl_block;
401 var octetstring data := f_rnd_octstring(10);
402 var uint32_t sched_fn;
403 var uint32_t dl_fn;
404 var GprsMS ms;
405 timer T;
406
407 /* Initialize NS/BSSGP side */
408 f_init_bssgp();
409 /* Initialize GPRS MS side */
410 f_init_gprs_ms();
411 ms := g_ms[0]; /* We only use first MS in this test */
412
413 /* Initialize the PCU interface abstraction */
414 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
415
416 /* Establish BSSGP connection to the PCU */
417 f_bssgp_establish();
418 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
419
420 /* Establish an Uplink TBF */
421 f_ms_establish_ul_tbf(ms);
422
423 /* Send one UL block (with TLLI since we are in One-Phase Access
424 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200425 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 +0100426 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
427 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
428 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
429
430 /* UL block should be received in SGSN */
431 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
432
433 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
434 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
435 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
436
437 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
438 f_sleep(X2002);
439 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
440
441 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
442 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
443
444 T.start(2.0);
445 alt {
446 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
447 setverdict(pass);
448 }
449 [] T.timeout {
450 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
451 f_shutdown(__BFILE__, __LINE__);
452 }
453 }
454
455 /* Make sure we don't receive data for that TBF since it was released
456 * before. Also check our TBF is not polled for UL. */
457 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
458 if (dl_block.ctrl.mac_hdr.usf != USF_UNUSED) {
459 setverdict(fail, "Unexpected USF ", dl_block.ctrl.mac_hdr.usf);
460 f_shutdown(__BFILE__, __LINE__);
461 }
462
463 /* New data arrives, PCU should page the MS since no TBF active exists: */
464 /* Send some more data, it will never reach the MS */
465 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
466 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
467
468 f_shutdown(__BFILE__, __LINE__, final := true);
469}
470
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200471/* Test of correct Timing Advance at the time of TBF establishment
472 * (derived from timing offset of the Access Burst). */
473testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200474 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200475
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200476 /* Initialize GPRS MS side */
477 f_init_gprs_ms();
478 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200479 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100480 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200481
482 /* We cannot send too many TBF requests in a short time because
483 * at some point the PCU will fail to allocate a new TBF. */
484 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
485 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200486 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700487 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200488
489 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200490 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700491 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200492 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700493 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700494 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200495 }
496 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700497
498 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200499}
500
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200501/* Verify Timing Advance value indicated in Packet Uplink ACK/NACK message
502 * sent in response to the first Uplink block after resource allocation. */
503testcase TC_ta_ul_ack_nack_first_block() runs on RAW_PCU_Test_CT {
504 var GprsMS ms := valueof(t_GprsMS_def);
505 var PacketUlAckNack ul_ack_nack;
506 var PacketTimingAdvance pkt_ta;
507 var RlcmacDlBlock dl_block;
508 var uint32_t sched_fn;
509
510 /* Initialize NS/BSSGP side */
511 f_init_bssgp();
512
513 /* Initialize the PCU interface abstraction */
514 f_init_raw(testcasename());
515
516 /* Establish BSSGP connection to the PCU */
517 f_bssgp_establish();
518 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
519
520 /* Establish an Uplink TBF */
521 f_ms_establish_ul_tbf(ms);
522
523 /* In a busy network, there can be a significant delay between resource
524 * allocation (Packet Uplink Assignment above) and the actual time when
525 * the MS is allowed to transmit the first Uplink data block. */
526
527 /* Simulate a delay > 0 */
528 ms.ta := 2;
529
530 /* We're in One-Phase Access contention resoultion, include TLLI */
531 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
532 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
533
534 ul_ack_nack := dl_block.ctrl.payload.u.ul_ack_nack;
535 if (ispresent(ul_ack_nack.gprs.pkt_ta)) {
536 pkt_ta := ul_ack_nack.gprs.pkt_ta;
537 } else if (ispresent(ul_ack_nack.egprs.pkt_ta)) {
538 pkt_ta := ul_ack_nack.egprs.pkt_ta;
539 } else {
540 setverdict(fail, "PacketTimingAdvance IE is not present");
541 f_shutdown(__BFILE__, __LINE__);
542 }
543
544 if (not ispresent(pkt_ta.val)) {
545 setverdict(fail, "Timing Advance value is not present");
546 f_shutdown(__BFILE__, __LINE__);
547 } else if (pkt_ta.val != ms.ta) {
548 setverdict(fail, "Timing Advance mismatch: expected ",
549 ms.ta, ", but received ", pkt_ta.val);
550 f_shutdown(__BFILE__, __LINE__);
551 }
552}
553
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200554/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
555 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
556 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
557 * no active TBF exists at the moment of establishment (idle mode). */
558testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100559 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200560
561 /* Initialize NS/BSSGP side */
562 f_init_bssgp();
563
564 /* Initialize the PCU interface abstraction */
565 f_init_raw(testcasename());
566
567 /* Establish BSSGP connection to the PCU */
568 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100569 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200570
571 /* SGSN sends some DL data, PCU will initiate Packet Downlink
572 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100573 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
574 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200575
576 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
577 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
578 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100579 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700580 setverdict(fail, "Timing Advance value doesn't match");
581 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700582
583 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200584}
585
586/* Verify that the PCU generates valid PTCCH/D messages
587 * while neither Uplink nor Downlink TBF is established. */
588testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100589 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200590 timer T;
591
592 /* Initialize the PCU interface abstraction */
593 f_init_raw(testcasename());
594
595 /* Sent an RTS.req for PTCCH/D */
596 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
597 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
598 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100599
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200600 T.start(5.0);
601 alt {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100602 /* Make sure the message is encoded correctly
603 * TODO: do we expect all TA values to be equal '1111111'B? */
604 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg);
605
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200606 [] BTS.receive(PCUIF_Message:?) { repeat; }
607 [] T.timeout {
608 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700609 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200610 }
611 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100612 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700613
614 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200615}
616
617/* Test of correct Timing Advance during an active Uplink TBF.
618 *
619 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
620 * are not continuous and there can be long time gaps between them. This happens
621 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
622 * significantly change between such rare Uplink transmissions, so GPRS introduces
623 * additional mechanisms to control Timing Advance, and thus reduce interference
624 * between neighboring TDMA time-slots.
625 *
626 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
627 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
628 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
629 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
630 * among with the initial Timing Advance value. And here PTCCH comes to play.
631 *
632 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
633 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
634 * continuously. To ensure continuous measurements of the signal propagation
635 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
636 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
637 *
638 * The purpose of this test case is to verify the assignment of Timing Advance
639 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
640 * first establishes several Uplink TBFs, but does not transmit any Uplink
641 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
642 * indications to the PCU, checking the correctness of two received PTCCH/D
643 * messages (period of PTCCH/D is two multi-frames).
644 */
645
646/* List of ToA values for Access Bursts to be sent on PTCCH/U,
647 * each ToA (Timing of Arrival) value is in units of 1/4 of
648 * a symbol (i.e. 1 symbol is 4 QTA units). */
649type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
650const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
651 0, 0, 0, 0,
652 0, 0, 0, 0,
653 0, 0, 0, 0,
654 0, 0, 0, 0
655};
656
657private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
658 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
659runs on RAW_PCU_Test_CT {
660 var RAW_PCU_Event event;
661 var integer ss;
662
663 /* Send Access Bursts on PTCCH/U for every TA Index */
664 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
665 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700666 if (ss < 0) { /* Shall not happen */
667 f_shutdown(__BFILE__, __LINE__);
668 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200669
670 log("Sending an Access Burst on PTCCH/U",
671 ", sub-slot=", ss, " (TAI)",
672 ", fn=", event.data.tdma_fn,
673 ", ToA=", toa_map[ss], " (QTA)");
674 /* TODO: do we care about RA and burst format? */
675 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
676 ra := oct2int('3A'O),
677 is_11bit := 0,
678 burst_type := BURST_TYPE_0,
679 fn := event.data.tdma_fn,
680 arfcn := 871,
681 qta := toa_map[ss],
682 sapi := PCU_IF_SAPI_PTCCH));
683 repeat;
684 }
685}
686
687private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
688 template PTCCHDownlinkMsg t_ta_msg)
689runs on RAW_PCU_Test_CT {
690 var PTCCHDownlinkMsg ta_msg;
691 var PCUIF_Message pcu_msg;
692 timer T;
693
694 /* First, send an RTS.req for the upcoming PTCCH/D block */
695 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
696 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
697 arfcn := 871, block_nr := 0));
698 T.start(2.0);
699 alt {
700 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
701 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
702 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
703 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
704 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
705 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
706 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
707 log("Rx PTCCH/D message: ", ta_msg);
708
709 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700710 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200711 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
712 }
713 }
714 [] BTS.receive { repeat; }
715 [] T.timeout {
716 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200717 }
718 }
719}
720
721testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
722 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200723 var GprsMS ms;
724
725 /* Initialize GPRS MS side */
726 f_init_gprs_ms();
727 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200728
729 /* Initialize the PCU interface abstraction */
730 f_init_raw(testcasename());
731
732 /* Enable forwarding of PTCCH/U TDMA events to us */
733 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
734
735 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
736 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200737 /* Establish an Uplink TBF */
738 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200739
740 /* We expect incremental TFI/USF assignment (dynamic allocation) */
741 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200742 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200743 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700744 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200745 }
746
747 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200748 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200749 setverdict(fail, "Failed to match Timing Advance Index for #", i);
750 /* Keep going, the current OsmoPCU does not assign TA Index */
751 }
752 }
753
754 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
755 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
756 for (var integer i := 0; i < 7; i := i + 1) {
757 /* ToA in units of 1/4 of a symbol */
758 toa_map[i] := (i + 1) * 7 * 4;
759 }
760
761 /* Now we have all 7 TBFs established in one-phase access mode,
762 * however we will not be sending any data on them. Instead, we
763 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
764 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
765 *
766 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
767 * time-slots, so at the moment of scheduling a PTCCH/D block
768 * the PCU has odd number of PTCCH/U Access Bursts received. */
769 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
770 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
771 /* Other values are not known (yet) */
772 tai3_ta := ?));
773 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
774 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
775 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
776 /* Other values are out of our interest */
777 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700778
779 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200780}
781
782/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
783 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
784 *
785 * NOTE: the ranges are intentionally overlapping because OsmoPCU
786 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
787private template integer CS1_lqual_dB_range := (-infinity .. 6);
788private template integer CS2_lqual_dB_range := (5 .. 8);
789private template integer CS3_lqual_dB_range := (7 .. 13);
790private template integer CS4_lqual_dB_range := (12 .. infinity);
791
792testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200793 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200794 var GprsMS ms;
795 var uint32_t unused_fn, sched_fn;
796 var uint4_t cv;
797
798 /* Initialize GPRS MS side */
799 f_init_gprs_ms();
800 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200801
802 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100803 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200804
805 f_pcuvty_set_allowed_cs_mcs();
806 f_pcuvty_set_link_quality_ranges();
807
808 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200809 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200810
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200811
812 /* The actual / old link quality values. We need to keep track of the old
813 * (basically previous) link quality value, because OsmoPCU actually
814 * changes the coding scheme if not only the actual, but also the old
815 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200816 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200817 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200818
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200819 /* Send one UL block (with TLLI since we are in One-Phase Access
820 contention resoultion) and make sure it is ACKED fine. */
821 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
822 /* 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 +0200823 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 +0200824 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
825 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
826 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200827
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200828 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
829 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200830 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200831 lqual_old := ms.lqual_cb;
832 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
834 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200835 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
836 if (i > g_bs_cv_max) {
837 cv := 15;
838 } else {
839 cv := i;
840 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200841
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200842 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
843
844 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
845 f_rx_rlcmac_dl_block(dl_block, unused_fn);
846 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
847 continue;
848 }
849 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
850 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
851 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
852 f_shutdown(__BFILE__, __LINE__);
853 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200854
855 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
856 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
857
858 /* Match the received Channel Coding Command. Since we are increasing
859 * the link quality value on each iteration and not decreasing, there
860 * is no need to check the both old and current link quality values. */
861 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200862 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200863 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
864 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
865 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
866 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
867 }
868
869 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
870 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200871 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200872 }
873 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700874
875 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200876}
877
878/* Test the max UL CS set by VTY works fine */
879testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200880 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200881 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200882 var uint32_t unused_fn, sched_fn;
883 var GprsMS ms;
884
885 /* Initialize GPRS MS side */
886 f_init_gprs_ms();
887 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200888
889 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100890 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200891
892 /* Set initial UL CS to 3 */
893 g_cs_initial_ul := 3;
894 f_pcuvty_set_allowed_cs_mcs();
895 f_pcuvty_set_link_quality_ranges();
896
897 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200898 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200899
900 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200901 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200902
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200903 /* Send one UL block (with TLLI since we are in One-Phase Access
904 contention resoultion) and make sure it is ACKED fine. */
905 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
906 /* 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 +0200907 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 +0200908 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
909 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
910 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200911
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200912 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
913 while (true) {
914 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
915 f_rx_rlcmac_dl_block(dl_block, unused_fn);
916 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
917 continue;
918 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200919
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
921 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
922 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
923 f_shutdown(__BFILE__, __LINE__);
924 break;
925 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200926
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200927 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200928 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200929 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200930 if (last_ch_coding != CH_CODING_CS3) {
931 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200933 }
934
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200935 /* Remaining UL blocks are used to make sure regardless of initial
936 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200937 /* 0 dB, make sure we downgrade CS */
938 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200939 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200940 f_ms_tx_ul_data_block_multi(ms, 5);
941 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
942 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
943 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200944
945 if (last_ch_coding != CH_CODING_CS1) {
946 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200947 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200948 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700949
950 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200951}
952
953/* Test the max UL CS set by VTY works fine */
954testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200955 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200956 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200957 var uint32_t unused_fn, sched_fn;
958 var GprsMS ms;
959
960 /* Initialize GPRS MS side */
961 f_init_gprs_ms();
962 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200963
964 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100965 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200966
967 /* Set maximum allowed UL CS to 3 */
968 g_cs_max_ul := 3;
969 f_pcuvty_set_allowed_cs_mcs();
970 f_pcuvty_set_link_quality_ranges();
971
972 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200973 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200974
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200975 /* Send one UL block (with TLLI since we are in One-Phase Access
976 contention resoultion) and make sure it is ACKED fine. */
977 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
978 /* 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 +0200979 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 +0200980 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
981 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
982 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200983
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200984 ms.lqual_cb := 40*10; /* 40 dB */
985 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200986
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200987 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
988 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200989
990 if (last_ch_coding != CH_CODING_CS3) {
991 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200992 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200993 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700994
995 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200996}
997
Pau Espin Pedrol75122592020-11-03 15:22:59 +0100998/* Test the initial DL CS set by VTY works fine */
999testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1000 var octetstring data := f_rnd_octstring(10);
1001 var CodingScheme exp_dl_cs_mcs;
1002 var RlcmacDlBlock dl_block;
1003 var uint32_t poll_fn;
1004 var GprsMS ms;
1005
1006 /* Initialize NS/BSSGP side */
1007 f_init_bssgp();
1008 /* Initialize GPRS MS side */
1009 f_init_gprs_ms();
1010 ms := g_ms[0]; /* We only use first MS in this test */
1011
1012 /* Initialize the PCU interface abstraction */
1013 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1014
1015 /* Set initial allowed DL CS to 3 */
1016 g_cs_initial_dl := 3;
1017 exp_dl_cs_mcs := CS_3;
1018 /* Set maximum allowed UL CS to 4 */
1019 g_cs_max_dl := 4;
1020 f_pcuvty_set_allowed_cs_mcs();
1021 f_pcuvty_set_link_quality_ranges();
1022
1023 /* Establish BSSGP connection to the PCU */
1024 f_bssgp_establish();
1025 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1026
1027 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1028 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1029 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1030
1031 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1032 f_sleep(X2002);
1033 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1034
1035 /* ACK the DL block */
1036 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1037 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1038 f_dl_block_ack_fn(dl_block, poll_fn));
1039
1040 f_shutdown(__BFILE__, __LINE__, final := true);
1041}
1042
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001043/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001044function 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 +01001045 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001046 var RlcmacDlBlock prev_dl_block, dl_block;
1047 var uint32_t ack_fn;
1048 var uint32_t fn;
1049 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001050 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001051 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001052 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1053 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001054 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001055
1056 if (using_egprs) {
1057 exp_tmp_csmcs := mcs_egprs_any;
1058 bsn_mod := 2048;
1059 } else {
1060 exp_tmp_csmcs := cs_gprs_any;
1061 bsn_mod := 128;
1062 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001063
1064 /* Establish BSSGP connection to the PCU */
1065 f_bssgp_establish();
1066
1067 ms := g_ms[0]; /* We only use first MS in this test */
1068 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1069
1070 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001071 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001072 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1073
1074 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1075 f_sleep(X2002);
1076
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001077 for (var integer i := 0; i < 800; i := i + 1) {
1078 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001079 f_rx_rlcmac_dl_block(dl_block, fn);
1080
1081 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1082 /* No more data to receive, done */
1083 break;
1084 }
1085
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001086 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001087
1088 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001089 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001090
1091 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001092 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001093 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001094 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 +01001095 if (tx_data_remain != 0) {
1096 /* Submit more data from time to time to keep the TBF ongoing */
1097 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1098 tx_data_remain := tx_data_remain - 1;
1099 }
1100 }
1101 prev_dl_block := dl_block;
1102 }
1103
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001104 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1105 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001106
1107
1108 f_shutdown(__BFILE__, __LINE__, final := true);
1109}
1110
1111/* Verify DL CS above "cs max" set by VTY is never used */
1112testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1113 /* Initialize NS/BSSGP side */
1114 f_init_bssgp();
1115 /* Initialize GPRS MS side */
1116 f_init_gprs_ms();
1117
1118 /* Initialize the PCU interface abstraction */
1119 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1120
1121 /* Set maximum allowed DL CS to 3 */
1122 g_cs_initial_dl := 1;
1123 g_cs_max_dl := 3;
1124 f_pcuvty_set_allowed_cs_mcs();
1125 f_pcuvty_set_link_quality_ranges();
1126
1127 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1128}
1129
1130/* Check DL CS4 is used in good link conditions if allowed by config */
1131testcase TC_dl_cs1_to_cs4() 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 initial DL CS to 1 & maximum allowed DL CS to 4 */
1141 g_cs_initial_dl := 1;
1142 g_cs_max_dl := 4;
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
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001149/* Test the initial UL MCS set by VTY works fine */
1150testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1151 var RlcmacDlBlock dl_block;
1152 var PollFnCtx pollctx;
1153 var EgprsChCodingCommand last_ch_coding;
1154 var uint32_t unused_fn, sched_fn;
1155 var GprsMS ms;
1156 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001157
1158 /* Initialize GPRS MS side */
1159 f_init_gprs_ms();
1160 ms := g_ms[0]; /* We only use first MS in this test */
1161
1162 /* Initialize the PCU interface abstraction */
1163 f_init_raw(testcasename());
1164
1165 /* Set initial UL MCS to 3 */
1166 g_mcs_initial_ul := 3;
1167 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1168 f_pcuvty_set_allowed_cs_mcs();
1169 f_pcuvty_set_link_quality_ranges();
1170
1171 /* Take lqual (dB->cB) so that we stay in that MCS */
1172 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1173
1174 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001175 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 +01001176
1177 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1178 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1179 f_shutdown(__BFILE__, __LINE__);
1180 }
1181
1182 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1183 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1184
1185 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1186 while (true) {
1187 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1188 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1189 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1190 continue;
1191 }
1192
1193 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1194 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1195 f_shutdown(__BFILE__, __LINE__);
1196 break;
1197 }
1198
1199 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1200 break;
1201 }
1202 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1203 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1204 f_shutdown(__BFILE__, __LINE__);
1205 }
1206
1207 /* Remaining UL blocks are used to make sure regardless of initial
1208 * lqual, we can go lower at any time
1209 * 0 dB, make sure we downgrade MCS */
1210 ms.lqual_cb := 0;
1211 /* 5 UL blocks, check we are in same initial MCS: */
1212 f_ms_tx_ul_data_block_multi(ms, 5);
1213 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1214 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1215 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1216
1217 if (last_ch_coding != CH_CODING_MCS1) {
1218 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1219 f_shutdown(__BFILE__, __LINE__);
1220 }
1221
1222 f_shutdown(__BFILE__, __LINE__, final := true);
1223}
1224
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001225/* Test the maximum UL MCS set by VTY works fine */
1226testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1227 var RlcmacDlBlock dl_block;
1228 var EgprsChCodingCommand last_ch_coding;
1229 var PollFnCtx pollctx;
1230 var uint32_t unused_fn, sched_fn;
1231 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001232
1233 /* Initialize GPRS MS side */
1234 f_init_gprs_ms();
1235 ms := g_ms[0]; /* We only use first MS in this test */
1236
1237 /* Initialize the PCU interface abstraction */
1238 f_init_raw(testcasename());
1239
1240 /* Set maximum allowed UL MCS to 5 */
1241 g_mcs_max_ul := 5;
1242 f_pcuvty_set_allowed_cs_mcs();
1243 f_pcuvty_set_link_quality_ranges();
1244
1245 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001246 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 +01001247 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1248 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1249
1250 ms.lqual_cb := 40*10; /* 40 dB */
1251 f_ms_tx_ul_data_block_multi(ms, 16);
1252
1253 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1254 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1255
1256 if (last_ch_coding != CH_CODING_MCS5) {
1257 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1258 f_shutdown(__BFILE__, __LINE__);
1259 }
1260
1261 f_shutdown(__BFILE__, __LINE__, final := true);
1262}
1263
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001264/* Test the initial DL CS set by VTY works fine */
1265testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1266 var octetstring data := f_rnd_octstring(10);
1267 var CodingScheme exp_dl_cs_mcs;
1268 var RlcmacDlBlock dl_block;
1269 var uint32_t poll_fn;
1270 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001271
1272 /* Initialize NS/BSSGP side */
1273 f_init_bssgp();
1274 /* Initialize GPRS MS side */
1275 f_init_gprs_ms();
1276 ms := g_ms[0]; /* We only use first MS in this test */
1277
1278 /* Initialize the PCU interface abstraction */
1279 f_init_raw(testcasename());
1280
1281 /* Set initial allowed DL MCS to 3 */
1282 g_mcs_initial_dl := 3;
1283 exp_dl_cs_mcs := MCS_3;
1284 /* Set maximum allowed DL MCS to 4 */
1285 g_mcs_max_dl := 4;
1286 f_pcuvty_set_allowed_cs_mcs();
1287 f_pcuvty_set_link_quality_ranges();
1288
1289 /* Establish BSSGP connection to the PCU */
1290 f_bssgp_establish();
1291 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1292
1293 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001294 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001295 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1296
1297 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1298 f_sleep(X2002);
1299 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1300
1301 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001302 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1303 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 +01001304 f_dl_block_ack_fn(dl_block, poll_fn));
1305
1306 f_shutdown(__BFILE__, __LINE__, final := true);
1307}
1308
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001309/* Verify DL MCS above "mcs max" set by VTY is never used */
1310testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1311 /* Initialize NS/BSSGP side */
1312 f_init_bssgp();
1313 /* Initialize GPRS MS side */
1314 f_init_gprs_ms();
1315
1316 /* Initialize the PCU interface abstraction */
1317 f_init_raw(testcasename());
1318
1319 /* Set maximum allowed DL CS to 3 */
1320 g_mcs_initial_dl := 1;
1321 g_mcs_max_dl := 3;
1322 f_pcuvty_set_allowed_cs_mcs();
1323 f_pcuvty_set_link_quality_ranges();
1324
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001325 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 +01001326}
1327
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001328/* Verify PCU drops TBF after some time of inactivity. */
1329testcase TC_t3141() runs on RAW_PCU_Test_CT {
1330 var PCUIF_info_ind info_ind;
1331 var template (value) TsTrxBtsNum nr;
1332 var BTS_PDTCH_Block data_msg;
1333 var GprsMS ms;
1334 var uint3_t rx_usf;
1335 timer T_3141 := 1.0;
1336 var boolean ul_tbf_usf_req := false;
1337
1338 /* Initialize NS/BSSGP side */
1339 f_init_bssgp();
1340 /* Initialize GPRS MS side */
1341 f_init_gprs_ms();
1342 ms := g_ms[0]; /* We only use first MS in this test */
1343
1344 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1345 /* Only use 1 PDCH to simplify test: */
1346 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1347 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1348 /* Initialize the PCU interface abstraction */
1349 f_init_raw(testcasename(), info_ind);
1350
1351 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1352
1353 /* Establish BSSGP connection to the PCU */
1354 f_bssgp_establish();
1355 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1356
1357 /* Establish a one-phase access Uplink TBF */
1358 f_ms_establish_ul_tbf(ms);
1359
1360 T_3141.start;
1361
1362 /* Now we wait for PCU to transmit our USF */
1363 nr := ts_TsTrxBtsNum;
1364 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1365 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1366 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1367 block_nr := nr.blk_nr));
1368
1369 alt {
1370 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1371 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1372 ?)) -> value data_msg {
1373 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1374 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1375 f_shutdown(__BFILE__, __LINE__);
1376 }
1377
1378 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1379 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1380 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1381 ul_tbf_usf_req := true;
1382 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))
1383 } else if (rx_usf == USF_UNUSED) {
1384 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1385 if (ul_tbf_usf_req) {
1386 /* TBF was dropped by T3141, success */
1387 setverdict(pass);
1388 break;
1389 } else {
1390 log("PCU never requested USF, unexpected");
1391 f_shutdown(__BFILE__, __LINE__);
1392 }
1393 } /* else: Keep waiting for TBF to be active by network */
1394 } else {
1395 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1396 f_shutdown(__BFILE__, __LINE__);
1397 }
1398
1399 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1400 if (match(data_msg.dl_block,
1401 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1402 tr_UlAckNackGprs(tlli := ?,
1403 acknack_desc := ?,
1404 rel99 := *))))
1405 {
1406 log("Received UL ACK/NACK with TLLI set");
1407 f_shutdown(__BFILE__, __LINE__);
1408 }
1409
1410 nr := ts_TsTrxBtsNum;
1411 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1412 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1413 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1414 block_nr := nr.blk_nr));
1415 repeat;
1416 }
1417 [] T_3141.timeout {
1418 log("T_3141 expired but TBF is still active, unexpected");
1419 f_shutdown(__BFILE__, __LINE__);
1420 }
1421 [] BTS.receive {
1422 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1423 * because we never sent the TLLI to the PCU */
1424 setverdict(fail, "Unexpected BTS message");
1425 f_shutdown(__BFILE__, __LINE__);
1426 }
1427 }
1428
1429 f_shutdown(__BFILE__, __LINE__, final := true);
1430}
1431
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001432/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1433 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1434 * T3169. See OS#5033 */
1435testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1436 var PCUIF_info_ind info_ind;
1437 var template (value) TsTrxBtsNum nr;
1438 var BTS_PDTCH_Block data_msg;
1439 var GprsMS ms;
1440 var uint3_t rx_usf;
1441 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1442 var integer n3101 := 0;
1443 timer T_3169 := 1.0;
1444
1445 /* Initialize NS/BSSGP side */
1446 f_init_bssgp();
1447 /* Initialize GPRS MS side */
1448 f_init_gprs_ms();
1449 ms := g_ms[0]; /* We only use first MS in this test */
1450
1451 /* Initialize the PCU interface abstraction */
1452 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1453 info_ind.n3101 := N3101_MAX;
1454 info_ind.t3169 := 1;
1455 f_init_raw(testcasename(), info_ind);
1456
1457 /* Establish BSSGP connection to the PCU */
1458 f_bssgp_establish();
1459 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1460
1461 /* Establish UL TBF */
1462 f_ms_establish_ul_tbf(ms);
1463
1464 /* Now we wait for PCU to transmit our USF */
1465 nr := ts_TsTrxBtsNum;
1466 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1467 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1468 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1469 block_nr := nr.blk_nr));
1470
1471 alt {
1472 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1473 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1474 ?)) -> value data_msg {
1475 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1476 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1477 f_shutdown(__BFILE__, __LINE__);
1478 }
1479
1480 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1481 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1482 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1483 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001484 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1485 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001486 f_shutdown(__BFILE__, __LINE__);
1487 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001488 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001489 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1490 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1491 if (not T_3169.running) {
1492 log("T3169 started");
1493 T_3169.start;
1494 }
1495 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1496 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1497 f_shutdown(__BFILE__, __LINE__);
1498 } else {
1499 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1500 }
1501 nr := ts_TsTrxBtsNum;
1502 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1503 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1504 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1505 block_nr := nr.blk_nr));
1506 repeat;
1507 }
1508 [] T_3169.timeout {
1509 log("T_3169 expired");
1510 /* Done in alt */
1511 }
1512 [] BTS.receive {
1513 setverdict(fail, "Unexpected BTS message");
1514 f_shutdown(__BFILE__, __LINE__);
1515 }
1516 }
1517
1518 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1519 /* USFs as per previous TBF since they were freed at expiration time: */
1520 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1521 var uint5_t old_tfi := ms.ul_tbf.tfi;
1522 f_ms_establish_ul_tbf(ms);
1523 if (old_tfi != ms.ul_tbf.tfi) {
1524 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1525 f_shutdown(__BFILE__, __LINE__);
1526 }
1527 for (var integer i := 0; i < 8; i := i +1) {
1528 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1529 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1530 f_shutdown(__BFILE__, __LINE__);
1531 }
1532 }
1533
1534 f_shutdown(__BFILE__, __LINE__, final := true);
1535}
1536
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001537
1538/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1539 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1540 the final UL ACK sent at us. */
1541testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1542 var PCUIF_info_ind info_ind;
1543 var BTS_PDTCH_Block data_msg;
1544 var RlcmacDlBlock dl_block;
1545 var uint32_t sched_fn;
1546 var template (value) TsTrxBtsNum nr;
1547 var template RlcmacDlBlock exp_ul_ack;
1548 var template UlAckNackGprs exp_ul_ack_sub;
1549 var GprsMS ms;
1550 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1551 var integer N3103 := 0;
1552 timer T_3169 := 1.0;
1553
1554 /* Initialize GPRS MS side */
1555 f_init_gprs_ms();
1556 ms := g_ms[0]; /* We only use first MS in this test */
1557
1558 /* Initialize the PCU interface abstraction */
1559 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1560 info_ind.n3103 := N3103_MAX;
1561 info_ind.t3169 := 1;
1562 f_init_raw(testcasename(), info_ind);
1563
1564 /* Establish an Uplink TBF */
1565 f_ms_establish_ul_tbf(ms);
1566
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001567 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001568 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1569 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1570
1571 nr := ts_TsTrxBtsNum;
1572 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1573 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1574 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1575 block_nr := nr.blk_nr));
1576 alt {
1577 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1578 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1579 exp_ul_ack)) -> value data_msg {
1580 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1581 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1582 f_shutdown(__BFILE__, __LINE__);
1583 }
1584
1585 nr := ts_TsTrxBtsNum;
1586 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1587 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1588 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1589 block_nr := nr.blk_nr));
1590 N3103 := N3103 + 1;
1591 if (N3103 == N3103_MAX) {
1592 /* At this point in time (N3103_MAX reached), PCU is
1593 * moving the TBF to RELEASE state so no data/ctrl for
1594 * it is tx'ed, hence the dummy blocks: */
1595 T_3169.start;
1596 }
1597 repeat;
1598 }
1599 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1600 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1601 exp_ul_ack)) -> value data_msg {
1602 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1603 f_shutdown(__BFILE__, __LINE__);
1604 }
1605 [] as_ms_rx_ignore_dummy(ms, nr);
1606 [T_3169.running] T_3169.timeout {
1607 log("T_3169 timeout");
1608 /* Done in alt, wait for pending RTS initiated previously in
1609 * above case before continuing (expect /* Dummy block): */
1610 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1611 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1612 tr_RLCMAC_DUMMY_CTRL));
1613 }
1614 [] BTS.receive {
1615 setverdict(fail, "Unexpected BTS message");
1616 f_shutdown(__BFILE__, __LINE__);
1617 }
1618 }
1619
1620 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1621 * USFs as per previous TBF since they were freed at expiration time: */
1622 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1623 var uint5_t old_tfi := ms.ul_tbf.tfi;
1624 f_ms_establish_ul_tbf(ms);
1625 if (old_tfi != ms.ul_tbf.tfi) {
1626 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1627 f_shutdown(__BFILE__, __LINE__);
1628 }
1629 for (var integer i := 0; i < 8; i := i +1) {
1630 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1631 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1632 f_shutdown(__BFILE__, __LINE__);
1633 }
1634 }
1635
1636 f_shutdown(__BFILE__, __LINE__, final := true);
1637}
1638
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001639/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1640 * point the TBF is no longer available. In order to get to start of T3191, we
1641 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1642 * until TBF release procedure starts after draining DL queue. */
1643testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1644 var PCUIF_info_ind info_ind;
1645 var RlcmacDlBlock dl_block;
1646 var octetstring data1 := f_rnd_octstring(200);
1647 var octetstring data2 := f_rnd_octstring(10);
1648 var uint32_t dl_fn;
1649 var template (value) TsTrxBtsNum nr;
1650 var BTS_PDTCH_Block data_msg;
1651 var GprsMS ms;
1652
1653 /* Initialize NS/BSSGP side */
1654 f_init_bssgp();
1655 /* Initialize GPRS MS side */
1656 f_init_gprs_ms();
1657 ms := g_ms[0]; /* We only use first MS in this test */
1658
1659 /* Initialize the PCU interface abstraction */
1660 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1661 /* Set timer to 1 sec (default 5) to speedup test: */
1662 info_ind.t3191 := 1;
1663 f_init_raw(testcasename(), info_ind);
1664
1665 /* Establish BSSGP connection to the PCU */
1666 f_bssgp_establish();
1667 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1668
1669 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1670 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1671 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1672
1673 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1674 f_sleep(X2002);
1675
1676 while (true) {
1677 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1678
1679 /* Keep Ack/Nack description updated (except for last BSN) */
1680 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1681
1682 if (f_dl_block_rrbp_valid(dl_block)) {
1683 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1684 f_dl_block_ack_fn(dl_block, dl_fn));
1685 break;
1686 }
1687 }
1688
1689 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1690 nr := ts_TsTrxBtsNum;
1691 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1692 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1693 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1694 block_nr := nr.blk_nr));
1695 alt {
1696 [] as_ms_rx_ignore_dummy(ms, nr);
1697 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1698 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1699 ?)) -> value data_msg {
1700 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1701 log("Received FINAL_ACK");
1702 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1703 break;
1704 }
1705 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1706 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1707 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1708 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1709 }
1710 nr := ts_TsTrxBtsNum;
1711 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1712 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1713 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1714 block_nr := nr.blk_nr));
1715 repeat;
1716 }
1717 [] BTS.receive {
1718 setverdict(fail, "Unexpected BTS message");
1719 f_shutdown(__BFILE__, __LINE__);
1720 }
1721 }
1722
1723 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1724 to time out. We simply sleep instead of requesting blocks because
1725 otherwise retransmissions would keep restarting the timer. */
1726 f_sleep(int2float(info_ind.t3191));
1727
1728 /* The TBF should be freed now, so new data should trigger an Assignment: */
1729 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1730 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1731
1732 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1733 f_sleep(X2002);
1734 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1735 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1736 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1737 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1738 f_dl_block_ack_fn(dl_block, dl_fn));
1739
1740 f_shutdown(__BFILE__, __LINE__, final := true);
1741}
1742
1743/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1744testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1745 var PCUIF_info_ind info_ind;
1746 var RlcmacDlBlock dl_block;
1747 var octetstring data1 := f_rnd_octstring(1400);
1748 var octetstring data2 := f_rnd_octstring(10);
1749 var uint32_t dl_fn;
1750 var GprsMS ms;
1751
1752 /* Initialize NS/BSSGP side */
1753 f_init_bssgp();
1754 /* Initialize GPRS MS side */
1755 f_init_gprs_ms();
1756 ms := g_ms[0]; /* We only use first MS in this test */
1757
1758 /* Initialize the PCU interface abstraction */
1759 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1760 /* Set timer to 1 sec (default 5) to speedup test: */
1761 info_ind.t3191 := 1;
1762 f_init_raw(testcasename(), info_ind);
1763
1764 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1765
1766 /* Establish BSSGP connection to the PCU */
1767 f_bssgp_establish();
1768 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1769
1770 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1771 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1772 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1773
1774 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1775 f_sleep(X2002);
1776
1777 /* Send enough DL data to at least be able to DL ACK once (excl the
1778 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1779 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1780 while (true) {
1781 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1782
1783 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1784 log("Received FINAL_ACK");
1785 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1786 break;
1787 }
1788
1789 /* Keep Ack/Nack description updated (except for last BSN) */
1790 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1791
1792 if (f_dl_block_rrbp_valid(dl_block)) {
1793 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1794 f_dl_block_ack_fn(dl_block, dl_fn));
1795 }
1796 }
1797
1798 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1799 to time out. We simply sleep instead of requesting blocks because
1800 otherwise retransmissions would keep restarting the timer. */
1801 f_sleep(int2float(info_ind.t3191));
1802
1803 /* The TBF should be freed now, so new data should trigger an Assignment: */
1804 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1805 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1806
1807 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1808 f_sleep(X2002);
1809 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1810 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1811 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
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 f_shutdown(__BFILE__, __LINE__, final := true);
1816}
1817
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001818/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1819 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1820 * T3193) after DL TBF release */
1821testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001822 var RlcmacDlBlock dl_block;
1823 var octetstring data := f_rnd_octstring(10);
1824 var boolean ok;
1825 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001826 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001827 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001828 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1829
1830 /* Initialize NS/BSSGP side */
1831 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001832 /* Initialize GPRS MS side */
1833 f_init_gprs_ms();
1834 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001835
1836 /* Initialize the PCU interface abstraction */
1837 f_init_raw(testcasename());
1838
1839 /* Establish BSSGP connection to the PCU */
1840 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001841 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001842
1843 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001844 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1845 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001846
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001847 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1848 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001849 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001850
1851 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001852 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1853 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1854 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001855
1856 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001857 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001858 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001859 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001860 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001861
1862 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001863
1864 /* 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 +07001865 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001866 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1867 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1868 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001869
1870 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001871}
1872
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001873/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1874 freed and no longer available. Trigger it by sending DL blocks and never DL
1875 ACKing the data (which are requested through RRBP) */
1876testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1877 var PCUIF_info_ind info_ind;
1878 var RlcmacDlBlock dl_block;
1879 var octetstring data1 := f_rnd_octstring(1000);
1880 var octetstring data2 := f_rnd_octstring(10);
1881 var uint32_t dl_fn;
1882 var template (value) TsTrxBtsNum nr;
1883 var BTS_PDTCH_Block data_msg;
1884 var GprsMS ms;
1885 const integer N3105_MAX := 2;
1886 var integer N3105 := 0;
1887 timer T_3195 := 1.0;
1888 var integer num_poll_recv := 0;
1889
1890 /* Initialize NS/BSSGP side */
1891 f_init_bssgp();
1892 /* Initialize GPRS MS side */
1893 f_init_gprs_ms();
1894 ms := g_ms[0]; /* We only use first MS in this test */
1895
1896 /* Initialize the PCU interface abstraction */
1897 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1898 /* Speedup test: */
1899 info_ind.n3105 := N3105_MAX;
1900 info_ind.t3195 := 1;
1901 f_init_raw(testcasename(), info_ind);
1902
1903 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1904 * MS and retransmitted after the TBF is released and later on created
1905 * (because the MS is reused) */
1906 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1907
1908 /* Establish BSSGP connection to the PCU */
1909 f_bssgp_establish();
1910 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1911
1912 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1913 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1914 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1915
1916 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1917 f_sleep(X2002);
1918
1919 /* Now we go on receiving DL data and not answering RRBP: */
1920 nr := ts_TsTrxBtsNum;
1921 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1922 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1923 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1924 block_nr := nr.blk_nr));
1925 alt {
1926 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1927 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1928 tr_RLCMAC_DATA)) -> value data_msg {
1929 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1930 if (num_poll_recv == 0) {
1931 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1932 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1933 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1934 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1935 } else {
1936 log("Ignoring RRBP ", num_poll_recv);
1937 N3105 := N3105 + 1;
1938 }
1939 num_poll_recv := num_poll_recv + 1;
1940 }
1941
1942 nr := ts_TsTrxBtsNum;
1943 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1944 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1945 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1946 block_nr := nr.blk_nr));
1947 repeat;
1948 }
1949 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1950 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1951 */
1952 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1953 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1954 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1955 if (not T_3195.running) {
1956 T_3195.start;
1957 /* We even send some new data, nothing should be sent to MS */
1958 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1959 }
1960 nr := ts_TsTrxBtsNum;
1961 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1962 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1963 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1964 block_nr := nr.blk_nr));
1965 repeat;
1966 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001967 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001968 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001969 /* Done in alt, wait for pending RTS initiated previously in
1970 * above case before continuing (expect /* Dummy block): */
1971 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1972 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1973 tr_RLCMAC_DUMMY_CTRL));
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001974 }
1975 [] BTS.receive {
1976 setverdict(fail, "Unexpected BTS message");
1977 f_shutdown(__BFILE__, __LINE__);
1978 }
1979 }
1980
1981 /* after T_3195 timeout, TBF is released */
1982 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1983 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1984
1985 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1986 f_sleep(X2002);
1987 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1988
1989 /* ACK the DL block */
1990 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1991 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1992 f_dl_block_ack_fn(dl_block, dl_fn));
1993
1994 f_shutdown(__BFILE__, __LINE__, final := true);
1995}
1996
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001997/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1998testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001999 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002000 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002001 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002002 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002003
2004 /* Initialize NS/BSSGP side */
2005 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002006 /* Initialize GPRS MS side */
2007 f_init_gprs_ms();
2008 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002009
2010 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002011 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002012
2013 /* Establish BSSGP connection to the PCU */
2014 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002015 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002016
2017 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002018 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002019
2020 /* Send one UL block (with TLLI since we are in One-Phase Access
2021 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002022 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002023 /* 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 +02002024 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 +02002025 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2026 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002027 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002028
2029 /* Send enough blocks to test whole procedure: Until Nth block
2030 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2031 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002032 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002033 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2034 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002035 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002036
2037 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002038 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 +07002039
2040 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002041}
2042
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002043/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2044testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2045 var RlcmacDlBlock dl_block;
2046 var uint32_t dl_fn, sched_fn;
2047 var octetstring payload;
2048 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002049 var template (value) LlcBlockHdr blk_hdr;
2050 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002051 var integer blk_len;
2052 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002053 var GprsMS ms;
2054
2055 /* Initialize NS/BSSGP side */
2056 f_init_bssgp();
2057 /* Initialize GPRS MS side */
2058 f_init_gprs_ms();
2059 ms := g_ms[0]; /* We only use first MS in this test */
2060
2061 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002062 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002063
2064 /* Establish BSSGP connection to the PCU */
2065 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002066 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002067
2068 /* Establish an Uplink TBF */
2069 f_ms_establish_ul_tbf(ms);
2070
2071 /* Send one UL block (with TLLI since we are in One-Phase Access
2072 contention resoultion) and make sure it is ACKED fine. */
2073 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002074 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2075 more := false, e := true);
2076 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002077 /* 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 +01002078 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2079 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002080 cv := 15,
2081 bsn := ms.ul_tbf.bsn,
2082 blocks := blocks,
2083 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002084 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002085 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002086
2087 /* ACK and check it was received fine */
2088 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2089 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2090 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2091 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002092 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 +02002093
2094 /* Test sending LLC PDUS of incrementing size */
2095 var integer max_size := 49;
2096 for (var integer i := 1; i <= max_size; i := i + 1) {
2097 var integer cv;
2098 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2099 log("Sending DATA.ind with LLC payload size ", i);
2100 if (i < max_size - g_bs_cv_max) {
2101 cv := 15;
2102 } else {
2103 cv := max_size - i;
2104 }
2105
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002106 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2107 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002108 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002109 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2110 more := false, e := true);
2111 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002112 /* 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 +01002113 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2114 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002115 cv := cv,
2116 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002117 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002118 f_ultbf_inc_bsn(ms.ul_tbf);
2119 f_ms_tx_ul_block(ms, ul_data);
2120
2121 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002122 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 +02002123
2124 /* we will receive UL ACK/NACK from time to time, handle it. */
2125 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2126 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2127 continue;
2128 }
2129 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2130 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2131 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2132 f_shutdown(__BFILE__, __LINE__);
2133 }
2134
2135 log("Rx Packet Uplink ACK / NACK");
2136 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2137 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2138 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2139 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002140
2141 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002142}
2143
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002144function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2145 var octetstring payload;
2146 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002147 var template (value) LlcBlockHdr blk_hdr;
2148 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002149 var integer block_len, max_valid_data_len;
2150 timer T;
2151
2152 block_len := f_rlcmac_cs_mcs2block_len(cs);
2153 /* We need to send with TLLI since we are in One-Phase Access Contenion
2154 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2155 * indicator, -1 for spare bits octet at the end */
2156 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2157 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 +07002158 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2159 more := false, e := true);
2160 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002161 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2162 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002163 cv := cv,
2164 bsn := ms.ul_tbf.bsn,
2165 blocks := blocks,
2166 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002167 f_ultbf_inc_bsn(ms.ul_tbf);
2168 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2169
2170 T.start(0.5);
2171 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002172 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002173 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2174 f_shutdown(__BFILE__, __LINE__);
2175 }
2176 [] T.timeout {
2177 setverdict(pass);
2178 }
2179 }
2180}
2181/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2182 blocks intentionally contain last byte of data placed in last byte of RLC
2183 containing padding/spare bits, which is incorrect. Spare bits exist and are
2184 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2185 discounting padding in octet" */
2186testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2187 var GprsMS ms;
2188 var integer block_len, max_valid_data_len;
2189
2190 /* Initialize NS/BSSGP side */
2191 f_init_bssgp();
2192 /* Initialize GPRS MS side */
2193 f_init_gprs_ms();
2194 ms := g_ms[0]; /* We only use first MS in this test */
2195
2196 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002197 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002198
2199 /* Establish BSSGP connection to the PCU */
2200 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002201 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002202
2203 /* Establish an Uplink TBF */
2204 f_ms_establish_ul_tbf(ms);
2205
2206 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2207 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2208 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2209
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002210 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002211}
2212
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002213/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2214 * answered, so TBFs for uplink and later for downlink are created.
2215 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002216private 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 +02002217 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002218 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002219 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002220 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002221 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002222
2223 /* Initialize NS/BSSGP side */
2224 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002225 /* Initialize GPRS MS side */
2226 f_init_gprs_ms();
2227 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002228
2229 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002230 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002231
2232 /* Establish BSSGP connection to the PCU */
2233 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002234 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002235
2236 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002237 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002238
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002239 /* Send one UL block (with TLLI since we are in One-Phase Access
2240 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002241 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 +02002242 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2243 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002244 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002245
2246 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002247 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002248
2249 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002250 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2251 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002252
2253 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2254 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002255 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002256
2257 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002258 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2259 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2260 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002261
2262 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002263}
2264
2265/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2266 * answered, so TBFs for uplink and later for downlink are created.
2267 */
2268testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002269 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002270 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002271}
2272
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002273/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2274 * answered, so TBFs for uplink and later for downlink are created.
2275 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002276private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2277 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002278 template (present) CodingScheme exp_ul_cs_mcs := ?,
2279 template (present) CodingScheme exp_dl_cs_mcs := ?)
2280runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002281 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002282 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002283 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002284 var uint32_t sched_fn;
2285 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002286 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002287 var GprsMS ms;
2288
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002289 /* Initialize NS/BSSGP side */
2290 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002291 /* Initialize GPRS MS side */
2292 f_init_gprs_ms();
2293 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002294
2295 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002296 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002297
2298 /* Establish BSSGP connection to the PCU */
2299 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002301
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002302 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2303 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 +02002304
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002305 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2306 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 +02002307 f_shutdown(__BFILE__, __LINE__);
2308 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002309
2310 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2311 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002312 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002313
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002314 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002315 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 +02002316
2317 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002318 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002319
2320 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002321 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002322 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2323 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002324 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002325 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002326 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002327
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002328 /* PCU acks the UL data after having received CV=0) */
2329 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2330
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002331 /* 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 +02002332 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 +02002333
2334 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002335 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2336 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 +02002337 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002338
2339 f_shutdown(__BFILE__, __LINE__, final := true);
2340}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002341
2342testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002343 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2344 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002345
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002346 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002347}
2348
2349testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002350 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2351 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002352
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002353 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_default, ms_racap_egprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002354}
2355
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002356testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2357 /* Configure PCU to force two phase access */
2358 g_force_two_phase_access := true;
2359
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002360 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002361 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002362
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002363 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002364}
2365
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002366/* Test scenario where SGSN wants to send some data against MS and it is
2367 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2368 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002369private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2370 template (present) CodingScheme exp_cs_mcs := ?)
2371runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002372 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002373 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002374 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002375 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002376 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002377
2378 /* Initialize NS/BSSGP side */
2379 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002380 /* Initialize GPRS MS side */
2381 f_init_gprs_ms();
2382 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002383
2384 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002385 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002386
2387 /* Establish BSSGP connection to the PCU */
2388 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002389 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002390
2391 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002392 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2393 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002394
2395 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2396 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002397 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002398
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002399 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002400 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2401 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 +02002402 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002403
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002404 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002405 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002406
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002407 /* Send one UL block (with TLLI since we are in One-Phase Access
2408 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002409 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002410 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2411 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002412 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002413
2414 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002415 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002416
2417 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002418}
2419
2420testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002421 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002422 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2423}
2424
2425/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2426/* information about the MS */
2427testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002428 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002429 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002430}
2431
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002432/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2433 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2434 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2435 * be transferred).
2436 */
2437testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002438 var RlcmacDlBlock dl_block;
2439 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002440 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002441 var octetstring total_payload;
2442 var octetstring payload;
2443 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002444 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002445 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002446 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002447
2448 /* Initialize NS/BSSGP side */
2449 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002450 /* Initialize GPRS MS side */
2451 f_init_gprs_ms();
2452 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002453
2454 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002455 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002456
2457 /* Establish BSSGP connection to the PCU */
2458 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002459 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002460
2461 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002462 f_ms_establish_ul_tbf(ms);
2463 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002464
2465 /* Send one UL block (with TLLI since we are in One-Phase Access
2466 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002467 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 +02002468 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 +02002469
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002470 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2471 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002472 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002473 total_payload := payload;
2474
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002475 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2476
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002477 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002478 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002479 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002480 total_payload := total_payload & payload;
2481
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002482 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002483 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002484 total_payload := total_payload & payload;
2485
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002486 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002487 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 +02002488 total_payload := total_payload & lost_payload;
2489
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002490 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002491 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002492 total_payload := total_payload & payload;
2493
2494 /* 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 +02002495 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002496
2497 /* On CV=0, we'll receive a UL ACK asking about missing block */
2498 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2499 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002500 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2501 tfi := tfi,
2502 cv := 15,
2503 bsn := 3,
2504 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002505 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002506
2507 /* Now final ack is recieved */
2508 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2509 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002510 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002511
2512 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002513 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 +07002514
2515 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002516}
2517
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002518/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2519 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2520 * timeout occurs (specified by sent RRBP on DL block). */
2521testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002522 var RlcmacDlBlock dl_block;
2523 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002524 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002525 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002526
2527 /* Initialize NS/BSSGP side */
2528 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002529 /* Initialize GPRS MS side */
2530 f_init_gprs_ms();
2531 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002532
2533 /* Initialize the PCU interface abstraction */
2534 f_init_raw(testcasename());
2535
2536 /* Establish BSSGP connection to the PCU */
2537 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002538 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002539
2540 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002541 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2542 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002543
2544 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2545 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002546 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002547
2548 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2549 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2550 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002551 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002552
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002553 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2554 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002555 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002556
2557 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002558 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2559 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2560 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002561
2562 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002563}
2564
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002565/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2566testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2567 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2568 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002569 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002570 var RlcmacDlBlock dl_block;
2571 var uint32_t ack_fn;
2572 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002573 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002574 timer T := 5.0;
2575
2576 /* Initialize NS/BSSGP side */
2577 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002578 /* Initialize GPRS MS side */
2579 f_init_gprs_ms();
2580 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002581
2582 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002583 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002584
Daniel Willmann535aea62020-09-21 13:27:08 +02002585 f_statsd_reset();
2586
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002587 /* Establish BSSGP connection to the PCU */
2588 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002589 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002590
2591 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002592 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2593 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002594
2595 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2596 f_sleep(X2002);
2597
2598 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2599 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002600 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002601
2602 /* TDMA frame number on which we are supposed to send the ACK */
2603 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2604
2605 /* SGSN sends more blocks during the indicated RRBP */
2606 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2607 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002608 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002609
2610 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2611
2612 /* Make sure this block has the same TFI as was assigned
2613 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002614 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002615 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2616 dl_block.data.mac_hdr.hdr_ext.tfi);
2617 f_shutdown(__BFILE__, __LINE__);
2618 }
2619
2620 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002621 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002622
2623 /* Break if this is the end of RRBP */
2624 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002625 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002626 break;
2627 }
2628 }
2629
2630 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002631 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 +07002632
2633 /* Make sure that the next block (after the Ack) is dummy */
2634 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2635
Daniel Willmann535aea62020-09-21 13:27:08 +02002636 var StatsDExpects expect := {
2637 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2638 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2639 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2640 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2641 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002642 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002643 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2644 };
2645 f_statsd_expect(expect);
2646
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002647 f_shutdown(__BFILE__, __LINE__, final := true);
2648}
2649
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002650/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2651 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2652 * Check "3GPP TS 44.060" Annex B. */
2653testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2654 var RlcmacDlBlock dl_block;
2655 var octetstring dataA := f_rnd_octstring(20);
2656 var octetstring dataB := f_rnd_octstring(13);
2657 var octetstring dataC := f_rnd_octstring(3);
2658 var octetstring dataD := f_rnd_octstring(12);
2659 var uint32_t sched_fn;
2660 var GprsMS ms;
2661 var template (value) RlcmacUlBlock ul_data;
2662
2663 /* Initialize NS/BSSGP side */
2664 f_init_bssgp();
2665 /* Initialize GPRS MS side */
2666 f_init_gprs_ms();
2667 ms := g_ms[0]; /* We only use first MS in this test */
2668
2669 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002670 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002671
2672 /* Establish BSSGP connection to the PCU */
2673 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002674 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002675
2676 /* Establish an Uplink TBF */
2677 f_ms_establish_ul_tbf(ms);
2678
2679 /* Summary of what's transmitted:
2680 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2681 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2682 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2683 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2684 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2685 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2686 */
2687
2688 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002689 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2690 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002691 cv := 3,
2692 bsn := ms.ul_tbf.bsn,
2693 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2694 tlli := ms.tlli);
2695 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2696 * RLCMAC block being sent. */
2697 ul_data.data.mac_hdr.e := true;
2698 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002699 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002700
2701 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002702 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2703 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002704 cv := 2,
2705 bsn := ms.ul_tbf.bsn,
2706 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2707 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2708 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2709 },
2710 tlli := ms.tlli);
2711 f_ultbf_inc_bsn(ms.ul_tbf);
2712 f_ms_tx_ul_block(ms, ul_data);
2713
2714 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002715 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 +02002716
2717 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002718 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2719 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002720 cv := 1,
2721 bsn := ms.ul_tbf.bsn,
2722 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2723 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2724 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2725 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2726 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2727 },
2728 tlli := ms.tlli);
2729 f_ultbf_inc_bsn(ms.ul_tbf);
2730 f_ms_tx_ul_block(ms, ul_data);
2731
2732 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002733 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2734 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 +02002735
2736 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002737 ul_data := t_RLCMAC_UL_DATA_TLLI(
2738 cs := CS_1,
2739 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002740 cv := 0,
2741 bsn := ms.ul_tbf.bsn,
2742 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2743 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2744 },
2745 tlli := ms.tlli);
2746 f_ultbf_inc_bsn(ms.ul_tbf);
2747 f_ms_tx_ul_block(ms, ul_data);
2748
2749 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002750 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 +02002751
2752 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2753 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2754 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2755
2756 f_shutdown(__BFILE__, __LINE__, final := true);
2757}
2758
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002759/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2760 * ACK/NACK is not answered */
2761testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2762 var RlcmacDlBlock dl_block;
2763 var octetstring data1 := f_rnd_octstring(200);
2764 var octetstring data2 := f_rnd_octstring(10);
2765 var uint32_t dl_fn;
2766 var GprsMS ms;
2767 var template (value) TsTrxBtsNum nr;
2768 var BTS_PDTCH_Block data_msg;
2769
2770 /* Initialize NS/BSSGP side */
2771 f_init_bssgp();
2772 /* Initialize GPRS MS side */
2773 f_init_gprs_ms();
2774 ms := g_ms[0]; /* We only use first MS in this test */
2775
2776 /* Initialize the PCU interface abstraction */
2777 f_init_raw(testcasename())
2778
2779 /* Establish BSSGP connection to the PCU */
2780 f_bssgp_establish();
2781 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2782
2783 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2784 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2785 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2786
2787 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2788 f_sleep(X2002);
2789
2790 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2791 while (true) {
2792 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2793
2794 /* Keep Ack/Nack description updated (except for last BSN) */
2795 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2796
2797 if (f_dl_block_rrbp_valid(dl_block)) {
2798 /* Don't transmit DL ACK here on purpose ignore it */
2799 break;
2800 }
2801 }
2802
2803 /* PCU starts whole process again */
2804 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2805
2806 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2807 f_sleep(X2002);
2808
2809 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2810 /* DL data), after that we receive only DUMMY blocks so we are done */
2811 var boolean data_received := false;
2812 nr := ts_TsTrxBtsNum;
2813 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2814 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2815 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2816 block_nr := nr.blk_nr));
2817 alt {
2818 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2819 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2820 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2821 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2822 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2823 tr_RLCMAC_DATA)) -> value data_msg {
2824 data_received := true;
2825 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2826 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2827 log("Received FINAL_ACK");
2828 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2829 }
2830 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2831 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2832 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2833 }
2834 nr := ts_TsTrxBtsNum;
2835 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2836 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2837 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2838 block_nr := nr.blk_nr));
2839 repeat;
2840 }
2841 [] BTS.receive {
2842 setverdict(fail, "Unexpected BTS message");
2843 f_shutdown(__BFILE__, __LINE__);
2844 }
2845 }
2846
2847 f_shutdown(__BFILE__, __LINE__, final := true);
2848}
2849
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002850/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2851testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002852 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002853 var octetstring data := f_rnd_octstring(10);
2854 var PacketDlAssign dl_tbf_ass;
2855 var RlcmacDlBlock dl_block;
2856 var uint32_t poll_fn;
2857 var uint32_t sched_fn;
2858 var GprsMS ms;
2859 timer T := 5.0;
2860
2861 /* Initialize NS/BSSGP side */
2862 f_init_bssgp();
2863 /* Initialize GPRS MS side */
2864 f_init_gprs_ms();
2865 ms := g_ms[0]; /* We only use first MS in this test */
2866
2867 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002868 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2869 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002870
2871 /* Initialize the PCU interface abstraction */
2872 f_init_raw(testcasename(), info_ind);
2873
2874 /* Establish BSSGP connection to the PCU */
2875 f_bssgp_establish();
2876 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2877
2878 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2879 through PDCH (no multiblock assignment possible through PCH) */
2880 f_ms_establish_ul_tbf(ms);
2881
2882 /* Send one UL block (with TLLI since we are in One-Phase Access
2883 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002884 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2885 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002886 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2887 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2888
2889 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2890 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2891 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2892 gprsextendeddynalloccap := '0'B
2893 };
2894 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2895 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2896 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2897 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2898 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2899 f_shutdown(__BFILE__, __LINE__);
2900 }
2901 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2902
2903 f_shutdown(__BFILE__, __LINE__, final := true);
2904}
2905
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002906testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002907 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002908 var RlcmacDlBlock dl_block;
2909 var octetstring data := f_rnd_octstring(10);
2910 var PollFnCtx pollctx;
2911 var uint32_t sched_fn;
2912 var GprsMS ms;
2913
2914 var MultislotCap_GPRS mscap_gprs := {
2915 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2916 gprsextendeddynalloccap := '0'B
2917 };
2918 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2919
2920
2921 /* Initialize NS/BSSGP side */
2922 f_init_bssgp();
2923 /* Initialize GPRS MS side */
2924 f_init_gprs_ms();
2925 ms := g_ms[0]; /* We only use first MS in this test */
2926
2927 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002928 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2929 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002930
2931 /* Initialize the PCU interface abstraction */
2932 f_init_raw(testcasename(), info_ind);
2933
2934 /* Establish BSSGP connection to the PCU */
2935 f_bssgp_establish();
2936 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2937
2938 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2939 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2940
2941 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2942 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2943
2944 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2945 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2946 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2947 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2948 f_shutdown(__BFILE__, __LINE__);
2949 }
2950 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2951
2952 f_shutdown(__BFILE__, __LINE__, final := true);
2953}
2954
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002955testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2956 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2957 var RlcmacDlBlock dl_block;
2958 var octetstring data := f_rnd_octstring(10);
2959 var PollFnCtx pollctx;
2960 var uint32_t sched_fn;
2961 var GprsMS ms;
2962
2963 var MultislotCap_GPRS mscap_gprs := {
2964 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2965 gprsextendeddynalloccap := '0'B
2966 };
2967 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2968
2969
2970 /* Initialize NS/BSSGP side */
2971 f_init_bssgp();
2972 /* Initialize GPRS MS side */
2973 f_init_gprs_ms();
2974 ms := g_ms[0]; /* We only use first MS in this test */
2975
2976 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002977 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2978 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002979
2980 /* Initialize the PCU interface abstraction */
2981 f_init_raw(testcasename(), info_ind);
2982
2983 /* Establish BSSGP connection to the PCU */
2984 f_bssgp_establish();
2985 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2986
2987 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2988 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2989
2990 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2991 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2992 f_shutdown(__BFILE__, __LINE__);
2993 }
2994
2995 f_shutdown(__BFILE__, __LINE__, final := true);
2996}
2997
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002998/* Test scenario where MS wants to request a new TBF once the current one is
2999 * ending, by means of sending a Packet Resource Request on ul slot provided by
3000 * last Pkt Ul ACK's RRBP.
3001 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3002testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003003 var RlcmacDlBlock dl_block;
3004 var octetstring data := f_rnd_octstring(10);
3005 var uint32_t sched_fn;
3006 var uint32_t dl_fn;
3007 var template RlcmacDlBlock acknack_tmpl;
3008 var GprsMS ms;
3009
3010 /* Initialize NS/BSSGP side */
3011 f_init_bssgp();
3012 /* Initialize GPRS MS side */
3013 f_init_gprs_ms();
3014 ms := g_ms[0]; /* We only use first MS in this test */
3015
3016 /* Initialize the PCU interface abstraction */
3017 f_init_raw(testcasename());
3018
3019 /* Establish BSSGP connection to the PCU */
3020 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003021 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003022
3023 /* Establish an Uplink TBF */
3024 f_ms_establish_ul_tbf(ms);
3025
3026 /* Send one UL block (with TLLI since we are in One-Phase Access
3027 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003028 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 +02003029
3030 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003031 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003032
3033 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3034 tr_UlAckNackGprs(ms.tlli,
3035 tr_AckNackDescription(final_ack := '1'B),
3036 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3037 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3038
3039 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3040
3041 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003042 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 +07003043 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003044 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3045 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3046
3047 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3048 and make sure it is ACKED fine */
3049 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3050
3051 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003052 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003053
3054 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3055 /* ACK the ACK */
3056 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3057
3058 f_shutdown(__BFILE__, __LINE__, final := true);
3059}
3060
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003061/* Test CS paging over the BTS<->PCU socket.
3062 * 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.
3063 * Paging should be send on the PACCH.
3064 *
3065 * 1. Send a Paging Request over PCU socket.
3066 * 2. Send a Ready-To-Send message over PCU socket
3067 * 3. Expect a Paging Frame
3068 */
3069testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003070 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003071 var MobileIdentityLV mi;
3072 var octetstring mi_enc_lv;
3073 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003074 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003075
3076 /* Initialize NS/BSSGP side */
3077 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003078 /* Initialize GPRS MS side */
3079 f_init_gprs_ms();
3080 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003081
3082 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003083 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003084
3085 /* Establish BSSGP connection to the PCU */
3086 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003087 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003088
3089 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003090 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003091
3092 /* build mobile Identity */
3093 mi := valueof(ts_MI_IMSI_LV(imsi));
3094 mi_enc_lv := enc_MobileIdentityLV(mi);
3095 /* Send paging request */
3096 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3097 sapi :=PCU_IF_SAPI_PDTCH));
3098
3099 /* Receive it on BTS side towards MS */
3100 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3101
3102 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003103 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3104 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3105 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3106 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003107
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003108 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003109}
3110
3111/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3112 */
3113private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3114runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003115 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003116 var hexstring imsi := f_gen_imsi(42);
3117 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003118 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003119
3120 /* Initialize NS/BSSGP side */
3121 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003122 /* Initialize GPRS MS side */
3123 f_init_gprs_ms();
3124 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003125
3126 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003127 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003128
3129 /* Establish BSSGP connection to the PCU */
3130 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003131 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003132
3133 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003134 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003135
3136 /* Send paging request with or without TMSI */
3137 if (use_ptmsi) {
3138 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3139 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3140 } else {
3141 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3142 }
3143
3144 /* Receive it on BTS side towards MS */
3145 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3146
3147 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003148 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003149 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003150 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3151 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3152 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003153 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003154 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3155 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3156 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003157 }
3158
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003159 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003160}
3161
3162testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3163 f_tc_paging_cs_from_sgsn(0, true);
3164}
3165
3166testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3167 f_tc_paging_cs_from_sgsn(0);
3168}
3169
3170testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003171 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003172}
3173
3174/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3175 */
3176private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3177runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003178 var integer imsi_suff_tx := 423;
3179 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003180 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003181
3182 /* Initialize NS/BSSGP side */
3183 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003184 /* Initialize GPRS MS side */
3185 f_init_gprs_ms();
3186 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003187
Oliver Smith61b4e732021-07-22 08:14:29 +02003188 f_statsd_reset();
3189
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003190 /* Establish BSSGP connection to the PCU */
3191 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003192 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003193
3194 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3195 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3196 if (use_ptmsi) {
3197 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3198 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3199 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3200 } else {
3201 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3202 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3203 }
3204
Oliver Smith61b4e732021-07-22 08:14:29 +02003205 if (mp_osmo_pcu_newer_than_0_9_0) {
3206 var StatsDExpects expect := {
Oliver Smith36d95d82021-08-06 22:01:53 +02003207 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3208 /* After the PCU receives the paging request from SGSN,
3209 * and it doesn't have any errors, PCU sends it to the
3210 * BTS to do paging over PCH. */
3211 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
Oliver Smith61b4e732021-07-22 08:14:29 +02003212 };
3213 f_statsd_expect(expect);
3214 }
Oliver Smithfbd39312021-07-27 15:23:39 +02003215}
3216
3217testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3218 /* Initialize the PCU interface abstraction */
3219 f_init_raw(testcasename());
3220
3221 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003222
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003223 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003224}
3225
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003226testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003227 /* Initialize the PCU interface abstraction */
3228 f_init_raw(testcasename());
3229
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003230 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003231
3232 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003233}
3234
3235testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003236 /* Initialize the PCU interface abstraction */
3237 f_init_raw(testcasename());
3238
Harald Welte5339b2e2020-10-04 22:52:56 +02003239 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003240
3241 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003242}
3243
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003244/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3245testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3246 var RlcmacDlBlock dl_block;
3247 var octetstring data := f_rnd_octstring(10);
3248 var uint32_t sched_fn;
3249 var uint32_t dl_fn;
3250 var GprsMS ms;
3251
3252 /* Initialize NS/BSSGP side */
3253 f_init_bssgp();
3254 /* Initialize GPRS MS side */
3255 f_init_gprs_ms();
3256 ms := g_ms[0]; /* We only use first MS in this test */
3257
3258 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003259 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003260
Daniel Willmann535aea62020-09-21 13:27:08 +02003261 f_statsd_reset();
3262
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003263 /* Establish BSSGP connection to the PCU */
3264 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003265 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003266
3267 /* Establish an Uplink TBF */
3268 f_ms_establish_ul_tbf(ms);
3269
3270 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003271 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 +02003272 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3273 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3274 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3275
3276 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003277 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003278
3279 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3280 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3281 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3282
3283 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3284 f_sleep(X2002);
3285 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3286
3287 /* ACK the DL block */
3288 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3289 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3290 f_dl_block_ack_fn(dl_block, dl_fn));
3291
Daniel Willmann535aea62020-09-21 13:27:08 +02003292 var StatsDExpects expect := {
3293 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3294 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3295 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3296 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003297 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003298 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003299 };
3300 f_statsd_expect(expect);
3301
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003302 f_shutdown(__BFILE__, __LINE__, final := true);
3303}
3304
3305/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3306testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3307 var RlcmacDlBlock dl_block;
3308 var octetstring data := f_rnd_octstring(10);
3309 var uint32_t sched_fn;
3310 var uint32_t dl_fn;
3311 var GprsMS ms;
3312
3313 /* Initialize NS/BSSGP side */
3314 f_init_bssgp();
3315 /* Initialize GPRS MS side */
3316 f_init_gprs_ms();
3317 ms := g_ms[0]; /* We only use first MS in this test */
3318
3319 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003320 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003321
3322 /* Establish BSSGP connection to the PCU */
3323 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003324 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003325
3326 /* Establish an Uplink TBF */
3327 f_ms_establish_ul_tbf(ms);
3328
3329 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003330 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 +02003331 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3332 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3333 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3334
3335 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003336 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003337
3338 /* Now SGSN sends some DL data with an invalid IMSI */
3339 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3340
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003341 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003342
3343 /* TODO: make sure no data is sent over PCU -> MS */
3344
3345 f_shutdown(__BFILE__, __LINE__, final := true);
3346}
3347
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003348private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3349 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3350 var octetstring data := f_rnd_octstring(6);
3351 var RlcmacDlBlock dl_block;
3352 var GprsMS ms;
3353 var uint32_t fn;
3354
3355 /* Initialize NS/BSSGP side */
3356 f_init_bssgp();
3357 /* Initialize GPRS MS side */
3358 f_init_gprs_ms();
3359 ms := g_ms[0]; /* We only use first MS in this test */
3360
3361 /* Initialize the PCU interface abstraction */
3362 f_init_raw(testcasename());
3363
3364 /* Establish BSSGP connection to the PCU */
3365 f_bssgp_establish();
3366 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3367
3368 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3369 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3370 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3371
3372 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3373 f_sleep(X2002);
3374
3375 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3376 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3377
3378 if (ischosen(dl_block.data_egprs)) {
3379 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3380 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3381 f_shutdown(__BFILE__, __LINE__);
3382 }
3383 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3384 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3385 f_shutdown(__BFILE__, __LINE__);
3386 }
3387 if (not match(dl_block.data_egprs.blocks[1].payload,
3388 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3389 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3390 f_shutdown(__BFILE__, __LINE__);
3391 }
3392 } else if (lengthof(dl_block.data.blocks) > 1) {
3393 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3394 f_shutdown(__BFILE__, __LINE__);
3395 }
3396
3397 f_shutdown(__BFILE__, __LINE__, final := true);
3398}
3399
3400/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3401 * containing llc data. See OS#4849 */
3402testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3403 f_tc_dl_data_no_llc_ui_dummy(omit);
3404}
3405
3406/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3407 * containing llc data. See OS#4849 */
3408testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003409 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003410}
3411
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003412private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003413 template GsmRrMessage t_imm_ass := ?,
3414 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003415runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003416 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003417 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003418
3419 ra11 := enc_EGPRSPktChRequest2uint(req);
3420 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3421
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003422 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003423 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003424 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003425 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003426 }
3427
3428 setverdict(pass);
3429}
3430
3431testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3432 var template GsmRrMessage imm_ass;
3433 var template IaRestOctets rest;
3434 var template EgprsUlAss ul_ass;
3435
3436 /* Initialize the PCU interface abstraction */
3437 f_init_raw(testcasename());
3438
3439 var EGPRSPktChRequest req := {
3440 /* NOTE: other fields are set in the loop */
3441 signalling := { tag := '110011'B }
3442 };
3443
3444 for (var integer i := 0; i < 6; i := i + 1) {
3445 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3446 req.signalling.random_bits := ext_ra;
3447
3448 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3449 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3450 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3451 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3452
3453 f_TC_egprs_pkt_chan_req(req, imm_ass);
3454 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003455
3456 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003457}
3458
3459testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3460 var template GsmRrMessage imm_ass;
3461 var template IaRestOctets rest;
3462 var template EgprsUlAss ul_ass;
3463
3464 /* Initialize the PCU interface abstraction */
3465 f_init_raw(testcasename());
3466
3467 var EGPRSPktChRequest req := {
3468 /* NOTE: other fields are set in the loop */
3469 one_phase := { tag := '0'B }
3470 };
3471
3472 for (var integer i := 0; i < 6; i := i + 1) {
3473 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3474 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3475 var BIT2 priority := substr(ext_ra, 0, 2);
3476 var BIT3 rand := substr(ext_ra, 2, 3);
3477
3478 req.one_phase.multislot_class := mslot_class;
3479 req.one_phase.priority := priority;
3480 req.one_phase.random_bits := rand;
3481
3482 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3483 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3484 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3485 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3486
3487 f_TC_egprs_pkt_chan_req(req, imm_ass);
3488 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003489
3490 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003491}
3492
3493testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3494 var template GsmRrMessage imm_ass;
3495 var template IaRestOctets rest;
3496 var template EgprsUlAss ul_ass;
3497
3498 /* Initialize the PCU interface abstraction */
3499 f_init_raw(testcasename());
3500
3501 var EGPRSPktChRequest req := {
3502 /* NOTE: other fields are set in the loop */
3503 two_phase := { tag := '110000'B }
3504 };
3505
3506 for (var integer i := 0; i < 6; i := i + 1) {
3507 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3508 var BIT2 priority := substr(ext_ra, 0, 2);
3509 var BIT3 rand := substr(ext_ra, 2, 3);
3510
3511 req.two_phase.priority := priority;
3512 req.two_phase.random_bits := rand;
3513
3514 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3515 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3516 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3517 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3518
3519 f_TC_egprs_pkt_chan_req(req, imm_ass);
3520 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003521
3522 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003523}
3524
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003525private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3526 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003527 PCUIF_BurstType bt := BURST_TYPE_1,
3528 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003529runs on RAW_PCU_Test_CT {
3530 var template ReqRefWaitInd tr_ref;
3531 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003532
3533 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3534 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3535 ra := bit2int(ra11), is_11bit := 1,
3536 burst_type := bt, fn := fn,
3537 arfcn := 871));
3538
3539 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003540 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003541
3542 /* Just to have a short-name reference to the actual message */
3543 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3544
3545 /* Make sure that Request Reference list contains at least one entry
3546 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003547 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003548 if (not match(iar.payload, { *, tr_ref, * })) {
3549 setverdict(fail, "Request Reference list does not match");
3550 f_shutdown(__BFILE__, __LINE__);
3551 }
3552
3553 /* Match Feature Indicator (must indicate PS domain) */
3554 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3555 setverdict(fail, "Feature Indicator does not match");
3556 f_shutdown(__BFILE__, __LINE__);
3557 }
3558
3559 /* Match IAR Rest Octets */
3560 if (not match(iar.rest_octets, rest)) {
3561 setverdict(fail, "IAR Rest Octets does not match: ",
3562 iar.rest_octets, " vs expected ", rest);
3563 f_shutdown(__BFILE__, __LINE__);
3564 }
3565
3566 setverdict(pass);
3567}
3568
3569/* Verify the contents of RR Immediate Assignment Reject message and its
3570 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3571testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3572 var template IARRestOctets rest;
3573 var BIT5 ext_ra;
3574
3575 /* Initialize the PCU interface abstraction */
3576 f_init_raw(testcasename());
3577
3578 for (var integer i := 0; i < 6; i := i + 1) {
3579 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3580 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3581
3582 /* Intentionally incorrect message (see table 11.2.5a.2) */
3583 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3584 }
3585
3586 f_shutdown(__BFILE__, __LINE__, final := true);
3587}
3588
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003589/* At the moment, the IUT does not support any emergency services. Make sure
3590 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3591testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3592 var template IARRestOctets rest;
3593 var BIT5 ext_ra;
3594 var BIT11 ra11;
3595
3596 /* Initialize the PCU interface abstraction */
3597 f_init_raw(testcasename());
3598
3599 var EGPRSPktChRequest req := {
3600 /* NOTE: other fields are set in the loop */
3601 emergency := { tag := '110111'B }
3602 };
3603
3604 for (var integer i := 0; i < 6; i := i + 1) {
3605 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3606 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3607
3608 req.emergency.random_bits := ext_ra;
3609 ra11 := enc_EGPRSPktChRequest2bits(req);
3610
3611 /* Intentionally incorrect message (see table 11.2.5a.2) */
3612 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3613 }
3614
3615 f_shutdown(__BFILE__, __LINE__, final := true);
3616}
3617
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003618/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3619testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003620 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003621 var template IARRestOctets rest;
3622 var BIT11 ra11;
3623
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003624 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003625 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003626
3627 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003628 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3629 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003630
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003631 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003632 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003633
3634 var EGPRSPktChRequest req := {
3635 one_phase := {
3636 tag := '0'B,
3637 multislot_class := '10101'B,
3638 priority := '01'B,
3639 random_bits := '101'B
3640 }
3641 };
3642
3643 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3644 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3645 for (var integer i := 0; i < 7; i := i + 1) {
3646 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3647 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3648 }
3649
3650 ra11 := enc_EGPRSPktChRequest2bits(req);
3651 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3652
3653 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003654 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003655
3656 f_shutdown(__BFILE__, __LINE__, final := true);
3657}
3658
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003659/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003660private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003661return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003662 /* Pick a random MA length in range 2 .. max_ma_len */
3663 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3664
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003665 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3666 hsn := f_rnd_int(63),
3667 maio := f_rnd_int(63),
3668 ma := f_rnd_bitstring(ma_len));
3669}
3670
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003671private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3672 in GsmRrMessage rr_msg)
3673{
3674 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003675 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003676
3677 var template PacketChannelDescription tr_pkt_chan_desc := {
3678 channel_Type_spare := ?,
3679 tn := ?,
3680 tsc := ts.tsc,
3681 presence := '1'B,
3682 zero := omit,
3683 one := {
3684 maio := ts.maio,
3685 hsn := ts.hsn
3686 }
3687 };
3688
3689 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3690 setverdict(fail, "Packet Channel Description does not match: ",
3691 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3692 }
3693
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003694 /* Mobile Allocation is expected to be octet-aligned */
3695 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3696 var template MobileAllocationLV tr_ma := {
3697 len := ma_oct_len, /* in bytes */
3698 ma := substr(ts.ma, 0, ma_oct_len * 8)
3699 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003700
3701 if (not match(ia.mobile_allocation, tr_ma)) {
3702 setverdict(fail, "Mobile Allocation does not match: ",
3703 ia.mobile_allocation, " vs ", tr_ma);
3704 }
3705
3706 setverdict(pass);
3707}
3708
3709/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3710testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003711 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003712 var GprsMS ms := valueof(t_GprsMS_def);
3713
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003714 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003715 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003716
3717 /* Initialize the PCU interface abstraction */
3718 f_init_raw(testcasename(), info_ind);
3719
3720 /* EGPRS Packet Channel Request (cause=Signalling) */
3721 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3722
3723 /* Establish an Uplink EGPRS TBF */
3724 f_ms_establish_ul_tbf(ms);
3725
3726 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3727 f_shutdown(__BFILE__, __LINE__, final := true);
3728}
3729
3730/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3731testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003732 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003733 var GprsMS ms := valueof(t_GprsMS_def);
3734
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003735 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003736 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003737
3738 /* Initialize the PCU interface abstraction */
3739 f_init_raw(testcasename(), info_ind);
3740
3741 /* Establish an Uplink TBF */
3742 f_ms_establish_ul_tbf(ms);
3743
3744 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3745 f_shutdown(__BFILE__, __LINE__, final := true);
3746}
3747
3748/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3749testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003750 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003751 var GprsMS ms := valueof(t_GprsMS_def);
3752
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003753 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003754 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003755
3756 /* Initialize NS/BSSGP side */
3757 f_init_bssgp();
3758
3759 /* Initialize the PCU interface abstraction */
3760 f_init_raw(testcasename(), info_ind);
3761
3762 /* Establish BSSGP connection to the PCU */
3763 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003764 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003765
3766 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3767 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3768 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3769
3770 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3771 f_shutdown(__BFILE__, __LINE__, final := true);
3772}
3773
3774private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3775 in FrequencyParameters fp)
3776{
3777 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003778 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003779
3780 /* Table 12.8.1: Frequency Parameters information elements */
3781 var template FrequencyParameters tr_fp := {
3782 tsc := ts.tsc,
3783 presence := '10'B, /* Direct encoding 1 */
3784 arfcn := omit,
3785 indirect := omit,
3786 direct1 := {
3787 maio := ts.maio,
3788 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3789 mobile_allocation := {
3790 hsn := ts.hsn,
3791 rfl_number_list_present := '0'B,
3792 rfl_number_list := omit,
3793 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003794 ma_length := ts.ma_bit_len,
3795 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003796 }
3797 },
3798 direct2 := omit
3799 };
3800
3801 if (not match(fp, tr_fp)) {
3802 setverdict(fail, "Frequency Parameters IE does not match: ",
3803 fp, " vs ", tr_fp);
3804 }
3805
3806 setverdict(pass);
3807}
3808
3809/* Make sure that Packet Uplink Assignment contains hopping parameters */
3810testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003811 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003812 var GprsMS ms := valueof(t_GprsMS_def);
3813 var uint32_t poll_fn;
3814
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003815 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003816 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003817
3818 /* Initialize the PCU interface abstraction */
3819 f_init_raw(testcasename(), info_ind);
3820
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003821 /* Single block (two phase) packet access */
3822 var uint16_t ra := bit2int(chan_req_sb);
3823 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
3824
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003825 /* Establish an Uplink TBF */
3826 f_ms_establish_ul_tbf(ms);
3827
3828 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003829 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
3830 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003831
3832 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003833 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3834 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003835
3836 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3837 var template (omit) FrequencyParameters fp;
3838 if (ua.is_egprs == '1'B) {
3839 fp := ua.egprs.freq_par;
3840 } else {
3841 fp := ua.gprs.freq_par;
3842 }
3843
3844 /* This is an optional IE, so it's worth to check its presence */
3845 if (istemplatekind(fp, "omit")) {
3846 setverdict(fail, "Frequency Parameters IE is not present");
3847 f_shutdown(__BFILE__, __LINE__);
3848 }
3849
3850 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3851 f_shutdown(__BFILE__, __LINE__, final := true);
3852}
3853
3854/* Make sure that Packet Downlink Assignment contains hopping parameters */
3855testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003856 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003857 var octetstring data := f_rnd_octstring(10);
3858 var GprsMS ms := valueof(t_GprsMS_def);
3859 var RlcmacDlBlock dl_block;
3860 var uint32_t poll_fn;
3861
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003862 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003863 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003864
3865 /* Initialize NS/BSSGP side */
3866 f_init_bssgp();
3867
3868 /* Initialize the PCU interface abstraction */
3869 f_init_raw(testcasename(), info_ind);
3870
3871 /* Establish BSSGP connection to the PCU */
3872 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003873 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003874
3875 /* Establish an Uplink TBF */
3876 f_ms_establish_ul_tbf(ms);
3877
3878 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003879 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 +07003880
3881 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3882 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3883 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3884
3885 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3886 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3887
3888 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003889 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3890 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003891
3892 /* This is an optional IE, so it's worth to check its presence */
3893 if (not ispresent(da.freq_par)) {
3894 setverdict(fail, "Frequency Parameters IE is not present");
3895 f_shutdown(__BFILE__, __LINE__);
3896 }
3897
3898 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3899 f_shutdown(__BFILE__, __LINE__, final := true);
3900}
3901
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003902/* Check if the IUT handles subsequent INFO.ind messages */
3903testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003904 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003905 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003906
3907 /* Initialize the PCU interface abstraction */
3908 f_init_raw(testcasename(), info_ind);
3909
3910 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3911 for (var integer i := 0; i < 16; i := i + 1) {
3912 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003913 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003914 }
3915
3916 f_shutdown(__BFILE__, __LINE__, final := true);
3917}
3918
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003919/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3920testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3921 var PCUIF_info_ind info_ind;
3922 var integer i;
3923 const integer num_ms := 8;
3924
3925 /* Initialize NS/BSSGP side */
3926 f_init_bssgp();
3927 /* Initialize GPRS MS side */
3928 f_init_gprs_ms(num_ms);
3929
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003930 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003931 /* Only the 3 first TRX are enabled. The enabled ones all have same
3932 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003933 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3934 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3935 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3936 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003937
3938 /* Initialize the PCU interface abstraction */
3939 f_init_raw(testcasename(), info_ind);
3940
3941 /* Establish BSSGP connection to the PCU */
3942 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003943 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003944
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003945 /* Establish an Uplink TBF for each GprsMS instance */
3946 f_multi_ms_establish_tbf(do_activate := false);
3947
3948 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003949 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003950 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003951 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003952 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003953 f_shutdown(__BFILE__, __LINE__);
3954 }
3955 }
3956
3957 f_shutdown(__BFILE__, __LINE__, final := true);
3958}
3959
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003960/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3961 * downgraded to CS1-4 so that GPRS can read the USF).
3962 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3963 */
3964testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3965 var PCUIF_info_ind info_ind;
3966 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3967 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003968 var uint32_t sched_fn, dl_fn, ack_fn;
3969 var octetstring data := f_rnd_octstring(10);
3970 var RlcmacDlBlock dl_block;
3971 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003972 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003973 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3974 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3975
3976 /* Initialize NS/BSSGP side */
3977 f_init_bssgp();
3978 /* Initialize GPRS MS side */
3979 f_init_gprs_ms(num_ms);
3980
3981 info_ind := valueof(ts_PCUIF_INFO_default);
3982 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003983 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3984 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003985
3986 /* Initialize the PCU interface abstraction */
3987 f_init_raw(testcasename(), info_ind);
3988
3989 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3990 g_mcs_initial_dl := 5;
3991 g_mcs_max_dl := 5;
3992 f_pcuvty_set_allowed_cs_mcs();
3993
3994 /* Establish BSSGP connection to the PCU */
3995 f_bssgp_establish();
3996 f_multi_ms_bssgp_register();
3997
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003998 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003999 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 +01004000 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4001 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4002 f_shutdown(__BFILE__, __LINE__);
4003 }
4004 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4005 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4006
4007 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004008 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 +01004009 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4010 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4011 f_shutdown(__BFILE__, __LINE__);
4012 }
4013 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4014 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4015
4016 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4017 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4018 f_sleep(0.1);
4019 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4020 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4021 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4022 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4023 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4024 /* ACK the DL block */
4025 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4026 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4027 f_dl_block_ack_fn(dl_block, dl_fn));
4028
4029 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4030 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4031 f_sleep(0.1);
4032 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4033 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4034 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4035 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4036 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4037 /* ACK the DL block */
4038 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4039 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4040 f_dl_block_ack_fn(dl_block, dl_fn));
4041
4042 data := f_rnd_octstring(1400);
4043 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4044 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4045
4046 for (var integer i := 0; i < 800; i := i + 1) {
4047 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4048
4049 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4050 /* No more data to receive, done */
4051 break;
4052 }
4053
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004054 usf_ms := -1;
4055
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004056 if (ischosen(dl_block.ctrl)) {
4057 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4058 f_shutdown(__BFILE__, __LINE__);
4059 } else if (ischosen(dl_block.data_egprs)) {
4060 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4061 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4062 f_shutdown(__BFILE__, __LINE__);
4063 }
4064 tgt_ms := 1;
4065 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4066 if (dl_block.data_egprs.mcs > MCS_4) {
4067 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4068 f_shutdown(__BFILE__, __LINE__);
4069 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004070 usf_ms := 0;
4071 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004072 } else {
4073 if (dl_block.data_egprs.mcs <= MCS_4) {
4074 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4075 f_shutdown(__BFILE__, __LINE__);
4076 }
4077 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004078 usf_ms := 1;
4079 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004080 }
4081 }
4082 } else {
4083 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4084 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4085 f_shutdown(__BFILE__, __LINE__);
4086 }
4087 tgt_ms := 0;
4088 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 +01004089 usf_ms := 0;
4090 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004091 } 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 +01004092 usf_ms := 1;
4093 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004094 }
4095 }
4096
4097 /* Keep Ack/Nack description updated */
4098 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4099
4100 /* TDMA frame number on which we are supposed to send the ACK */
4101 if (f_dl_block_rrbp_valid(dl_block)) {
4102 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4103 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);
4104 if (tx_data_remain != 0) {
4105 /* Submit more data from time to time to keep the TBF ongoing */
4106 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4107 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4108 tx_data_remain := tx_data_remain - 1;
4109 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004110 } else if (tx_data_remain != 0) {
4111 /* keep sending UL blocks when requested by USF to avoid
4112 * UL TBF timeout and hence stop receival of USFs */
4113 if (usf_ms != -1) {
4114 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4115 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004116 }
4117 }
4118
4119 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 +01004120 /* He we check that DL blocks scheduled at GPRS can still request UL
4121 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4122 * condition also ensures the downgrade to <=MCS4 condition is tested
4123 * above */
4124 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4125 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004126 f_shutdown(__BFILE__, __LINE__);
4127 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004128 /* Here check for some level of fairness between them (at least ~40%): */
4129 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4130 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4131 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4132 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4133 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4134 f_shutdown(__BFILE__, __LINE__);
4135 }
4136 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4137 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4138 f_shutdown(__BFILE__, __LINE__);
4139 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004140
4141 f_shutdown(__BFILE__, __LINE__, final := true);
4142}
4143
4144
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004145private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4146 boolean exp_imsi, boolean exp_tmsi)
4147runs on RAW_PCU_Test_CT {
4148 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4149 var integer pending := lengthof(g_ms);
4150 var RlcmacDlBlock dl_block;
4151 var boolean f1, f2;
4152
4153 while (pending > 0) {
4154 var uint32_t poll_fn;
4155
4156 /* Obtain a Downlink block and make sure it is a paging request */
4157 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4158 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4159 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4160 break;
4161 }
4162
4163 /* This should not happen in general, but who knows... */
4164 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4165 if (not ispresent(req.repeated_pageinfo)) {
4166 setverdict(fail, "Repeated Page Info IE is absent?!?");
4167 break;
4168 }
4169
4170 /* A single message may contain several MIs depending on their type */
4171 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4172 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4173 ps_domain := false);
4174 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4175 ps_domain := false);
4176 if (not f1 and not f2)
4177 { continue; }
4178
4179 /* Detect duplicate MIs */
4180 if (mask[i] == '1'B) {
4181 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4182 continue;
4183 }
4184
4185 mask[i] := '1'B;
4186 }
4187
4188 pending := pending - lengthof(req.repeated_pageinfo);
4189 }
4190
4191 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4192 if (mask[i] != '1'B) {
4193 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4194 log("===== mask := ", mask);
4195 }
4196 }
4197
4198 /* All messages must have been received by now, expect a dummy block */
4199 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4200}
4201
4202private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4203runs on RAW_PCU_Test_CT {
4204 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4205 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4206
4207 /* Initialize NS/BSSGP side */
4208 f_init_bssgp();
4209
4210 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004211 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004212
4213 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4214 f_init_gprs_ms(7 * 8);
4215
4216 /* Initialize the PCU interface abstraction */
4217 f_init_raw(testcasename(), info_ind);
4218
4219 /* Establish BSSGP connection to the PCU */
4220 f_bssgp_establish();
4221 f_multi_ms_bssgp_register();
4222
4223 /* Establish an Uplink TBF for each GprsMS instance */
4224 f_multi_ms_establish_tbf(do_activate := true);
4225}
4226
4227testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4228 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4229
4230 /* Common part: send INFO.ind, establish TBFs... */
4231 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4232
4233 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4234 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4235 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4236 }
4237
4238 /* FIXME: work around a race condition between PCUIF and BSSGP */
4239 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4240
4241 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4242 * The IUT is expected to page on all PDCH slots of all transceivers. */
4243 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4244 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4245 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4246 }
4247
4248 f_shutdown(__BFILE__, __LINE__, final := true);
4249}
4250
4251testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4252 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4253
4254 /* Common part: send INFO.ind, establish TBFs... */
4255 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4256
4257 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4258 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4259 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4260 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4261 }
4262
4263 /* FIXME: work around a race condition between PCUIF and BSSGP */
4264 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4265
4266 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4267 * The IUT is expected to page on all PDCH slots of all transceivers. */
4268 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4269 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4270 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4271 }
4272
4273 f_shutdown(__BFILE__, __LINE__, final := true);
4274}
4275
4276testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4277 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4278
4279 /* Common part: send INFO.ind, establish TBFs... */
4280 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4281
4282 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4283 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4284 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4285 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4286 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4287 } else {
4288 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4289 }
4290 }
4291
4292 /* FIXME: work around a race condition between PCUIF and BSSGP */
4293 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4294
4295 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4296 * The IUT is expected to page on all PDCH slots of all transceivers. */
4297 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4298 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4299 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4300 }
4301
4302 f_shutdown(__BFILE__, __LINE__, final := true);
4303}
4304
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004305private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004306runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4307 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004308 var integer i := 0;
4309 while (true) {
4310 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4311 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4312 break;
4313 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004314 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004315 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4316 f_shutdown(__BFILE__, __LINE__);
4317 }
4318 i := i + 1;
4319 }
4320 return dl_block;
4321}
4322
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004323private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4324runs on RAW_PCU_Test_CT {
4325 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),
4326 info_ind.lac),
4327 info_ind.rac),
4328 info_ind.cell_id));
4329 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4330 423),
4331 2),
4332 5));
4333 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4334 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4335 var template (value) RAN_Information_RIM_Container res_cont :=
4336 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4337 ts_RIM_Sequence_Number(2),
4338 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4339 ts_RIM_Protocol_Version_Number(1),
4340 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4341 omit);
4342 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4343 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4344 res_cont));
4345}
4346
4347altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4348runs on RAW_PCU_Test_CT {
4349 /* RIM procedure: */
4350 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),
4351 info_ind.lac),
4352 info_ind.rac),
4353 info_ind.cell_id));
4354 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4355 423),
4356 2),
4357 5));
4358 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4359 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4360 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4361 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4362 tr_RAN_Information_Request_RIM_Container)) {
4363 if (do_answer) {
4364 f_outbound_nacc_rim_tx_resp(info_ind);
4365 }
4366 if (do_repeat) {
4367 repeat;
4368 }
4369 }
4370}
4371
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004372/* Start NACC from MS side */
4373private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004374 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4375 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004376runs on RAW_PCU_Test_CT {
4377 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4378 var RlcmacDlBlock dl_block;
4379 var uint32_t sched_fn;
4380 var GsmArfcn req_arfcn := 862;
4381 var uint6_t req_bsic := 43;
4382
4383 /* Start NACC from MS side */
4384 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4385 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4386
4387 if (exp_rac_ci_query == true) {
4388 /* osmo-pcu should now ask for resolution: */
4389 f_ipa_ctrl_wait_link_up();
4390 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4391 int2str(info_ind.lac) & "." &
4392 int2str(info_ind.cell_id) & "." &
4393 int2str(req_arfcn) & "." &
4394 int2str(req_bsic);
4395 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4396 }
4397
4398 if (exp_si_query == true) {
4399 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004400 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004401 }
4402
4403 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004404 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004405
4406 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4407 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4408 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4409 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4410 f_shutdown(__BFILE__, __LINE__);
4411 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004412 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004413 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004414 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4415 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4416 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004417}
4418
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004419/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4420testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004421 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004422 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004423 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004424
4425 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4426 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4427
4428 /* Initialize NS/BSSGP side */
4429 f_init_bssgp();
4430 /* Initialize GPRS MS side */
4431 f_init_gprs_ms();
4432 ms := g_ms[0]; /* We only use first MS in this test */
4433
4434 /* Initialize the PCU interface abstraction */
4435 f_init_raw(testcasename(), info_ind);
4436
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004437 /* Make sure we are not affected by full cache from previous tests */
4438 f_pcuvty_flush_neigh_caches();
4439
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004440 /* Establish BSSGP connection to the PCU */
4441 f_bssgp_establish();
4442 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4443
4444 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004445 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 +01004446 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4447 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4448
4449 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004450 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004451
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004452 f_shutdown(__BFILE__, __LINE__, final := true);
4453}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004454
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004455/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4456testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4457 var PollFnCtx pollctx;
4458 var GprsMS ms;
4459 var RlcmacDlBlock dl_block;
4460 var uint32_t sched_fn;
4461 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004462
4463 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4464 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4465
4466 /* Initialize NS/BSSGP side */
4467 f_init_bssgp();
4468 /* Initialize GPRS MS side */
4469 f_init_gprs_ms();
4470 ms := g_ms[0]; /* We only use first MS in this test */
4471
4472 /* Initialize the PCU interface abstraction */
4473 f_init_raw(testcasename(), info_ind);
4474
4475 /* Make sure we are not affected by full cache from previous tests */
4476 f_pcuvty_flush_neigh_caches();
4477
4478 /* Establish BSSGP connection to the PCU */
4479 f_bssgp_establish();
4480 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4481
4482 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004483 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 +01004484 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4485 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4486
4487 /* Start NACC from MS side, avoid sending final CTRL ACK */
4488 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4489
4490 /* Wait until we receive something non-dummy */
4491 dl_block := f_skip_dummy(0, sched_fn);
4492 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4493 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4494 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4495 }
4496 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4497 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4498 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4499 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4500 }
4501
4502 f_shutdown(__BFILE__, __LINE__, final := true);
4503}
4504
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004505/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4506testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4507 var PollFnCtx pollctx;
4508 var GprsMS ms;
4509 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004510 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004511
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004512 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4513 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004514
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004515 /* Initialize NS/BSSGP side */
4516 f_init_bssgp();
4517 /* Initialize GPRS MS side */
4518 f_init_gprs_ms();
4519 ms := g_ms[0]; /* We only use first MS in this test */
4520
4521 /* Initialize the PCU interface abstraction */
4522 f_init_raw(testcasename(), info_ind);
4523
4524 /* Make sure we are not affected by full cache from previous tests */
4525 f_pcuvty_flush_neigh_caches();
4526 /* Set timeout values for caches so that entries will be in cache during second try */
4527 f_pcuvty_set_neigh_caches(10, 10);
4528
4529 /* Establish BSSGP connection to the PCU */
4530 f_bssgp_establish();
4531 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4532
4533 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004534 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 +01004535 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4536 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4537
4538 /* Start NACC from MS side */
4539 f_outbound_nacc_success(ms, info_ind);
4540
4541 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4542 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004543
4544 f_shutdown(__BFILE__, __LINE__, final := true);
4545}
4546
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004547/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4548 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4549 */
4550testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4551 var PollFnCtx pollctx;
4552 var GprsMS ms;
4553 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004554 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4555
4556 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4557 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4558
4559 /* Initialize NS/BSSGP side */
4560 f_init_bssgp();
4561 /* Initialize GPRS MS side */
4562 f_init_gprs_ms();
4563 ms := g_ms[0]; /* We only use first MS in this test */
4564
4565 /* Initialize the PCU interface abstraction */
4566 f_init_raw(testcasename(), info_ind);
4567
4568 /* Make sure we are not affected by full cache from previous tests */
4569 f_pcuvty_flush_neigh_caches();
4570 /* Set timeout values for caches so that entries will be erased before the second try */
4571 f_pcuvty_set_neigh_caches(1, 1);
4572
4573 /* Establish BSSGP connection to the PCU */
4574 f_bssgp_establish();
4575 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4576
4577 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004578 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 +01004579 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4580 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4581
4582 /* Start NACC from MS side */
4583 f_outbound_nacc_success(ms, info_ind);
4584
4585 /* CTRL client should have disconnected from us */
4586 f_ipa_ctrl_wait_link_down();
4587 /* wait for cache entries to time out */
4588 f_sleep(2.0);
4589 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4590 f_outbound_nacc_success(ms, info_ind);
4591
4592 f_shutdown(__BFILE__, __LINE__, final := true);
4593}
4594
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004595/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004596testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4597 var RlcmacDlBlock dl_block;
4598 var PollFnCtx pollctx;
4599 var uint32_t sched_fn;
4600 var GprsMS ms;
4601 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4602 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004603 var GsmArfcn req_arfcn := 862;
4604 var uint6_t req_bsic := 43;
4605
4606 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4607 * resolution CTRL port, to trigger Conn Refused by socket:
4608 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4609 */
4610
4611 /* Initialize NS/BSSGP side */
4612 f_init_bssgp();
4613 /* Initialize GPRS MS side */
4614 f_init_gprs_ms();
4615 ms := g_ms[0]; /* We only use first MS in this test */
4616
4617 /* Initialize the PCU interface abstraction */
4618 f_init_raw(testcasename(), info_ind);
4619
4620 /* Make sure we are not affected by full cache from previous tests */
4621 f_pcuvty_flush_neigh_caches();
4622
4623 /* Establish BSSGP connection to the PCU */
4624 f_bssgp_establish();
4625 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4626
4627 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004628 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 +01004629 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4630 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4631
4632 /* Start NACC from MS side */
4633 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4634 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4635
4636 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004637 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004638 /* Make sure it is a Pkt Cell Chg Continue */
4639 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4640 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4641 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004642 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4643 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4644 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4645 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4646 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004647
4648 f_shutdown(__BFILE__, __LINE__, final := true);
4649}
4650
4651/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004652testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4653 var RlcmacDlBlock dl_block;
4654 var PollFnCtx pollctx;
4655 var uint32_t sched_fn;
4656 var GprsMS ms;
4657 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4658 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004659 var GsmArfcn req_arfcn := 862;
4660 var uint6_t req_bsic := 43;
4661
4662 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4663 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4664
4665 /* Initialize NS/BSSGP side */
4666 f_init_bssgp();
4667 /* Initialize GPRS MS side */
4668 f_init_gprs_ms();
4669 ms := g_ms[0]; /* We only use first MS in this test */
4670
4671 /* Initialize the PCU interface abstraction */
4672 f_init_raw(testcasename(), info_ind);
4673
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004674 /* Make sure we are not affected by full cache from previous tests */
4675 f_pcuvty_flush_neigh_caches();
4676
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004677 /* Establish BSSGP connection to the PCU */
4678 f_bssgp_establish();
4679 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4680
4681 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004682 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 +01004683 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4684 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4685
4686 /* Start NACC from MS side */
4687 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4688 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4689
4690 /* osmo-pcu should now ask for resolution: */
4691 f_ipa_ctrl_wait_link_up();
4692 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4693 int2str(info_ind.lac) & "." &
4694 int2str(info_ind.cell_id) & "." &
4695 int2str(req_arfcn) & "." &
4696 int2str(req_bsic);
4697 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4698 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4699
4700 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004701 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004702 /* Make sure it is a Pkt Cell Chg Continue */
4703 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4704 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4705 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004706 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4707 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4708 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4709 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4710 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004711
4712 f_shutdown(__BFILE__, __LINE__, final := true);
4713}
4714
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004715/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4716testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4717 var RlcmacDlBlock dl_block;
4718 var PollFnCtx pollctx;
4719 var uint32_t sched_fn;
4720 var GprsMS ms;
4721 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4722 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004723 var GsmArfcn req_arfcn := 862;
4724 var uint6_t req_bsic := 43;
4725
4726 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4727 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4728
4729 /* Initialize NS/BSSGP side */
4730 f_init_bssgp();
4731 /* Initialize GPRS MS side */
4732 f_init_gprs_ms();
4733 ms := g_ms[0]; /* We only use first MS in this test */
4734
4735 /* Initialize the PCU interface abstraction */
4736 f_init_raw(testcasename(), info_ind);
4737
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004738 /* Make sure we are not affected by full cache from previous tests */
4739 f_pcuvty_flush_neigh_caches();
4740
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004741 /* Establish BSSGP connection to the PCU */
4742 f_bssgp_establish();
4743 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4744
4745 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004746 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 +01004747 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4748 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4749
4750 /* Start NACC from MS side */
4751 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4752 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4753
4754 /* osmo-pcu should now ask for resolution: */
4755 f_ipa_ctrl_wait_link_up();
4756 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4757 int2str(info_ind.lac) & "." &
4758 int2str(info_ind.cell_id) & "." &
4759 int2str(req_arfcn) & "." &
4760 int2str(req_bsic);
4761 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4762 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4763
4764 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004765 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004766 /* Make sure it is a Pkt Cell Chg Continue */
4767 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4768 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4769 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004770 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4771 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4772 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4773 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4774 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004775
4776 f_shutdown(__BFILE__, __LINE__, final := true);
4777}
4778
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004779/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4780testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4781 var RlcmacDlBlock dl_block;
4782 var PollFnCtx pollctx;
4783 var uint32_t sched_fn;
4784 var GprsMS ms;
4785 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4786 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004787 var GsmArfcn req_arfcn := 862;
4788 var uint6_t req_bsic := 43;
4789 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 */
4790 info_ind.lac),
4791 info_ind.rac),
4792 info_ind.cell_id));
4793 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4794 423),
4795 2),
4796 5));
4797 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4798 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4799
4800 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4801 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4802
4803 /* Initialize NS/BSSGP side */
4804 f_init_bssgp();
4805 /* Initialize GPRS MS side */
4806 f_init_gprs_ms();
4807 ms := g_ms[0]; /* We only use first MS in this test */
4808
4809 /* Initialize the PCU interface abstraction */
4810 f_init_raw(testcasename(), info_ind);
4811
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004812 /* Make sure we are not affected by full cache from previous tests */
4813 f_pcuvty_flush_neigh_caches();
4814
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004815 /* Establish BSSGP connection to the PCU */
4816 f_bssgp_establish();
4817 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4818
4819 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004820 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 +01004821 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4822 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4823
4824 /* Start NACC from MS side */
4825 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4826 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4827
4828 /* osmo-pcu should now ask for resolution: */
4829 f_ipa_ctrl_wait_link_up();
4830 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4831 int2str(info_ind.lac) & "." &
4832 int2str(info_ind.cell_id) & "." &
4833 int2str(req_arfcn) & "." &
4834 int2str(req_bsic);
4835 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4836
4837 /* RIM procedure: */
4838 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4839 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4840 tr_RAN_Information_Request_RIM_Container));
4841 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4842
4843 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004844 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004845 /* Make sure it is a Pkt Cell Chg Continue */
4846 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4847 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4848 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004849 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4850 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4851 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4852 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4853 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004854
4855 f_shutdown(__BFILE__, __LINE__, final := true);
4856}
4857
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004858/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4859testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4860 var PollFnCtx pollctx;
4861 var GprsMS ms;
4862 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4863 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4864 var RlcmacDlBlock dl_block;
4865 var uint32_t sched_fn;
4866 var CtrlMessage rx_ctrl;
4867 var GsmArfcn req_arfcn := 862;
4868 var uint6_t req_bsic := 43;
4869
4870 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4871 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4872
4873 /* Initialize NS/BSSGP side */
4874 f_init_bssgp();
4875 /* Initialize GPRS MS side */
4876 f_init_gprs_ms();
4877 ms := g_ms[0]; /* We only use first MS in this test */
4878
4879 /* Initialize the PCU interface abstraction */
4880 f_init_raw(testcasename(), info_ind);
4881
4882 /* Make sure we are not affected by full cache from previous tests */
4883 f_pcuvty_flush_neigh_caches();
4884
4885 /* Establish BSSGP connection to the PCU */
4886 f_bssgp_establish();
4887 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4888
4889 /* Send PACKET RESOURCE REQUEST */
4890 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4891 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4892 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4893
4894 /* Start NACC from MS side */
4895 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4896 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4897
4898 /* osmo-pcu should now ask for resolution: */
4899 f_ipa_ctrl_wait_link_up();
4900 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4901 int2str(info_ind.lac) & "." &
4902 int2str(info_ind.cell_id) & "." &
4903 int2str(req_arfcn) & "." &
4904 int2str(req_bsic);
4905 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4906 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4907 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4908 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4909 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4910 timer T := 2.0;
4911 T.start;
4912 alt {
4913 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4914 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4915 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4916 f_shutdown(__BFILE__, __LINE__);
4917 }
4918 [] T.timeout {
4919 setverdict(pass);
4920 }
4921 }
4922
4923 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004924 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004925
4926 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4927 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4928 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4929 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4930 f_shutdown(__BFILE__, __LINE__);
4931 }
4932 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4933 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4934 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4935 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4936 }
4937
4938 f_shutdown(__BFILE__, __LINE__, final := true);
4939}
4940
4941/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4942testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4943 var PollFnCtx pollctx;
4944 var GprsMS ms;
4945 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4946 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4947 var RlcmacDlBlock dl_block;
4948 var uint32_t sched_fn;
4949 var CtrlMessage rx_ctrl;
4950 var GsmArfcn req_arfcn := 862;
4951 var uint6_t req_bsic := 43;
4952
4953 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4954 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4955
4956 /* Initialize NS/BSSGP side */
4957 f_init_bssgp();
4958 /* Initialize GPRS MS side */
4959 f_init_gprs_ms();
4960 ms := g_ms[0]; /* We only use first MS in this test */
4961
4962 /* Initialize the PCU interface abstraction */
4963 f_init_raw(testcasename(), info_ind);
4964
4965 /* Make sure we are not affected by full cache from previous tests */
4966 f_pcuvty_flush_neigh_caches();
4967
4968 /* Establish BSSGP connection to the PCU */
4969 f_bssgp_establish();
4970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4971
4972 /* Send PACKET RESOURCE REQUEST */
4973 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4974 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4975 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4976
4977 /* Start NACC from MS side */
4978 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4979 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4980
4981 /* osmo-pcu should now ask for resolution: */
4982 f_ipa_ctrl_wait_link_up();
4983 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4984 int2str(info_ind.lac) & "." &
4985 int2str(info_ind.cell_id) & "." &
4986 int2str(req_arfcn) & "." &
4987 int2str(req_bsic);
4988 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4989 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4990 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4991 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4992 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4993 f_outbound_nacc_rim_tx_resp(info_ind);
4994 timer T := 1.0;
4995 T.start;
4996 alt {
4997 [] RIM.receive {
4998 setverdict(fail, "Received unexpected RIM message");
4999 f_shutdown(__BFILE__, __LINE__);
5000 }
5001 [] T.timeout {
5002 setverdict(pass);
5003 }
5004 }
5005
5006 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005007 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005008
5009 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5010 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5011 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5012 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5013 f_shutdown(__BFILE__, __LINE__);
5014 }
5015 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5016 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5017 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5018 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5019 }
5020
5021 f_shutdown(__BFILE__, __LINE__, final := true);
5022}
5023
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005024/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5025testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5026 var PollFnCtx pollctx;
5027 var GprsMS ms;
5028 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5029 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5030 var RlcmacDlBlock dl_block;
5031 var uint32_t sched_fn;
5032 var CtrlMessage rx_ctrl;
5033 var GsmArfcn req_arfcn := 862;
5034 var uint6_t req_bsic := 43;
5035
5036 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5037 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5038
5039 /* Initialize NS/BSSGP side */
5040 f_init_bssgp();
5041 /* Initialize GPRS MS side */
5042 f_init_gprs_ms();
5043 ms := g_ms[0]; /* We only use first MS in this test */
5044
5045 /* Initialize the PCU interface abstraction */
5046 f_init_raw(testcasename(), info_ind);
5047
5048 /* Make sure we are not affected by full cache from previous tests */
5049 f_pcuvty_flush_neigh_caches();
5050
5051 /* Establish BSSGP connection to the PCU */
5052 f_bssgp_establish();
5053 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5054
5055 /* Send PACKET RESOURCE REQUEST */
5056 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5057 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5058 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5059
5060 /* Start NACC from MS side */
5061 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5062 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5063
5064 /* osmo-pcu should now ask for resolution: */
5065 f_ipa_ctrl_wait_link_up();
5066 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5067 int2str(info_ind.lac) & "." &
5068 int2str(info_ind.cell_id) & "." &
5069 int2str(req_arfcn) & "." &
5070 int2str(req_bsic);
5071 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5072 /* RIM procedure: */
5073 as_outbound_nacc_rim_resolve(info_ind);
5074
5075 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5076 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5077 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5078
5079 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5080 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5081
5082 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5083 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5084 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5085 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5086 f_shutdown(__BFILE__, __LINE__);
5087 }
5088 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5089 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5090 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5091 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5092 }
5093}
5094
5095/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5096testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5097 var PollFnCtx pollctx;
5098 var GprsMS ms;
5099 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5100 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5101 var RlcmacDlBlock dl_block;
5102 var uint32_t sched_fn;
5103 var CtrlMessage rx_ctrl;
5104 var GsmArfcn req_arfcn := 862;
5105 var uint6_t req_bsic := 43;
5106
5107 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5108 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5109
5110 /* Initialize NS/BSSGP side */
5111 f_init_bssgp();
5112 /* Initialize GPRS MS side */
5113 f_init_gprs_ms();
5114 ms := g_ms[0]; /* We only use first MS in this test */
5115
5116 /* Initialize the PCU interface abstraction */
5117 f_init_raw(testcasename(), info_ind);
5118
5119 /* Make sure we are not affected by full cache from previous tests */
5120 f_pcuvty_flush_neigh_caches();
5121
5122 /* Establish BSSGP connection to the PCU */
5123 f_bssgp_establish();
5124 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5125
5126 /* Send PACKET RESOURCE REQUEST */
5127 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5128 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5129 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5130
5131 /* Start NACC from MS side */
5132 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5133 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5134
5135 /* osmo-pcu should now ask for resolution: */
5136 f_ipa_ctrl_wait_link_up();
5137 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5138 int2str(info_ind.lac) & "." &
5139 int2str(info_ind.cell_id) & "." &
5140 int2str(req_arfcn) & "." &
5141 int2str(req_bsic);
5142 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5143 /* RIM procedure: */
5144 as_outbound_nacc_rim_resolve(info_ind);
5145
5146 /* Announce SI back to MS, continue NACC procedure */
5147 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5148
5149 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5150 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5151
5152 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5153 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5154 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5155 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5156 f_shutdown(__BFILE__, __LINE__);
5157 }
5158 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5159 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5160 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5161 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5162 }
5163}
5164
5165/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5166testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5167 var PollFnCtx pollctx;
5168 var GprsMS ms;
5169 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5170 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5171 var RlcmacDlBlock dl_block;
5172 var uint32_t sched_fn;
5173 var CtrlMessage rx_ctrl;
5174 var GsmArfcn req_arfcn := 862;
5175 var uint6_t req_bsic := 43;
5176
5177 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5178 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5179
5180 /* Initialize NS/BSSGP side */
5181 f_init_bssgp();
5182 /* Initialize GPRS MS side */
5183 f_init_gprs_ms();
5184 ms := g_ms[0]; /* We only use first MS in this test */
5185
5186 /* Initialize the PCU interface abstraction */
5187 f_init_raw(testcasename(), info_ind);
5188
5189 /* Make sure we are not affected by full cache from previous tests */
5190 f_pcuvty_flush_neigh_caches();
5191
5192 /* Establish BSSGP connection to the PCU */
5193 f_bssgp_establish();
5194 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5195
5196 /* Send PACKET RESOURCE REQUEST */
5197 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5198 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5199 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5200
5201 /* Start NACC from MS side */
5202 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5203 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5204
5205 /* osmo-pcu should now ask for resolution: */
5206 f_ipa_ctrl_wait_link_up();
5207 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5208 int2str(info_ind.lac) & "." &
5209 int2str(info_ind.cell_id) & "." &
5210 int2str(req_arfcn) & "." &
5211 int2str(req_bsic);
5212 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5213 /* RIM procedure: */
5214 as_outbound_nacc_rim_resolve(info_ind);
5215
5216 /* Announce SI back to MS, continue NACC procedure */
5217 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5218
5219 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5220 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5221 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5222 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5223 f_shutdown(__BFILE__, __LINE__);
5224 }
5225 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5226 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5227
5228 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5229 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5230 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5231 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5232 }
5233}
5234
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005235/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5236 * while waiting for CTRL resolution */
5237testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5238 var PollFnCtx pollctx;
5239 var GprsMS ms;
5240 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5241 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5242 var RlcmacDlBlock dl_block;
5243 var uint32_t sched_fn;
5244 var CtrlMessage rx_ctrl;
5245 var GsmArfcn req_arfcn := 862;
5246 var uint6_t req_bsic := 43;
5247
5248 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5249 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5250
5251 /* Initialize NS/BSSGP side */
5252 f_init_bssgp();
5253 /* Initialize GPRS MS side */
5254 f_init_gprs_ms();
5255 ms := g_ms[0]; /* We only use first MS in this test */
5256
5257 /* Initialize the PCU interface abstraction */
5258 f_init_raw(testcasename(), info_ind);
5259
5260 /* Make sure we are not affected by full cache from previous tests */
5261 f_pcuvty_flush_neigh_caches();
5262
5263 /* Establish BSSGP connection to the PCU */
5264 f_bssgp_establish();
5265 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5266
5267 /* Send PACKET RESOURCE REQUEST */
5268 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5269 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5270 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5271
5272 /* Start NACC from MS side */
5273 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5274 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5275
5276 /* osmo-pcu should now ask for resolution: */
5277 f_ipa_ctrl_wait_link_up();
5278 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5279 int2str(info_ind.lac) & "." &
5280 int2str(info_ind.cell_id) & "." &
5281 int2str(req_arfcn) & "." &
5282 int2str(req_bsic);
5283 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5284 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5285 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5286 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5287 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5288 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5289 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5290 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5291 int2str(info_ind.lac) & "." &
5292 int2str(info_ind.cell_id) & "." &
5293 int2str(req_arfcn + 1) & "." &
5294 int2str(req_bsic + 1);
5295 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5296
5297 /* And finally everything continues as usual with RIN procedure */
5298 as_outbound_nacc_rim_resolve(info_ind);
5299
5300 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005301 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005302
5303 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5304 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5305 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5306 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5307 f_shutdown(__BFILE__, __LINE__);
5308 }
5309 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5310 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5311 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5312 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5313 }
5314
5315 f_shutdown(__BFILE__, __LINE__, final := true);
5316}
5317
5318/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5319 * while waiting for SI resolution */
5320testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5321 var PollFnCtx pollctx;
5322 var GprsMS ms;
5323 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5324 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5325 var RlcmacDlBlock dl_block;
5326 var uint32_t sched_fn;
5327 var CtrlMessage rx_ctrl;
5328 var GsmArfcn req_arfcn := 862;
5329 var uint6_t req_bsic := 43;
5330
5331 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5332 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5333
5334 /* Initialize NS/BSSGP side */
5335 f_init_bssgp();
5336 /* Initialize GPRS MS side */
5337 f_init_gprs_ms();
5338 ms := g_ms[0]; /* We only use first MS in this test */
5339
5340 /* Initialize the PCU interface abstraction */
5341 f_init_raw(testcasename(), info_ind);
5342
5343 /* Make sure we are not affected by full cache from previous tests */
5344 f_pcuvty_flush_neigh_caches();
5345
5346 /* Establish BSSGP connection to the PCU */
5347 f_bssgp_establish();
5348 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5349
5350 /* Send PACKET RESOURCE REQUEST */
5351 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5352 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5353 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5354
5355 /* Start NACC from MS side */
5356 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5357 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5358
5359 /* osmo-pcu should now ask for resolution: */
5360 f_ipa_ctrl_wait_link_up();
5361 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5362 int2str(info_ind.lac) & "." &
5363 int2str(info_ind.cell_id) & "." &
5364 int2str(req_arfcn) & "." &
5365 int2str(req_bsic);
5366 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5367 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5368 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5369 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5370 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5371 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5372 f_outbound_nacc_rim_tx_resp(info_ind);
5373
5374 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5375 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5376 int2str(info_ind.lac) & "." &
5377 int2str(info_ind.cell_id) & "." &
5378 int2str(req_arfcn + 1) & "." &
5379 int2str(req_bsic + 1);
5380 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5381
5382 /* And finally everything continues as usual with RIN procedure */
5383 as_outbound_nacc_rim_resolve(info_ind);
5384
5385 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005386 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005387
5388 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5389 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5390 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5391 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5392 f_shutdown(__BFILE__, __LINE__);
5393 }
5394 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5395 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5396 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5397 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5398 }
5399
5400 f_shutdown(__BFILE__, __LINE__, final := true);
5401}
5402
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005403/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5404 * while sending Pkt Neigh Data Change */
5405testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5406 var PollFnCtx pollctx;
5407 var GprsMS ms;
5408 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5409 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5410 var RlcmacDlBlock dl_block;
5411 var uint32_t sched_fn;
5412 var CtrlMessage rx_ctrl;
5413 var GsmArfcn req_arfcn := 862;
5414 var uint6_t req_bsic := 43;
5415
5416 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5417 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5418
5419 /* Initialize NS/BSSGP side */
5420 f_init_bssgp();
5421 /* Initialize GPRS MS side */
5422 f_init_gprs_ms();
5423 ms := g_ms[0]; /* We only use first MS in this test */
5424
5425 /* Initialize the PCU interface abstraction */
5426 f_init_raw(testcasename(), info_ind);
5427
5428 /* Make sure we are not affected by full cache from previous tests */
5429 f_pcuvty_flush_neigh_caches();
5430
5431 /* Establish BSSGP connection to the PCU */
5432 f_bssgp_establish();
5433 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5434
5435 /* Send PACKET RESOURCE REQUEST */
5436 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5437 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5438 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5439
5440 /* Start NACC from MS side */
5441 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5442 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5443
5444 /* osmo-pcu should now ask for resolution: */
5445 f_ipa_ctrl_wait_link_up();
5446 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5447 int2str(info_ind.lac) & "." &
5448 int2str(info_ind.cell_id) & "." &
5449 int2str(req_arfcn) & "." &
5450 int2str(req_bsic);
5451 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5452 /* RIM procedure: */
5453 as_outbound_nacc_rim_resolve(info_ind);
5454
5455 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5456 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5457 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5458 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5459
5460 /* It should trigger RAC_CI resolution to start again: */
5461 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5462 int2str(info_ind.lac) & "." &
5463 int2str(info_ind.cell_id) & "." &
5464 int2str(req_arfcn + 1) & "." &
5465 int2str(req_bsic + 1);
5466 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5467 /* RIM procedure: */
5468 as_outbound_nacc_rim_resolve(info_ind);
5469 /* Transmit SI back to MS */
5470 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
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 (different tgt cell) while sending Pkt Cell Change Continue */
5486testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() 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;
5496
5497 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5498 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5499
5500 /* Initialize NS/BSSGP side */
5501 f_init_bssgp();
5502 /* Initialize GPRS MS side */
5503 f_init_gprs_ms();
5504 ms := g_ms[0]; /* We only use first MS in this test */
5505
5506 /* Initialize the PCU interface abstraction */
5507 f_init_raw(testcasename(), info_ind);
5508
5509 /* Make sure we are not affected by full cache from previous tests */
5510 f_pcuvty_flush_neigh_caches();
5511
5512 /* Establish BSSGP connection to the PCU */
5513 f_bssgp_establish();
5514 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5515
5516 /* Send PACKET RESOURCE REQUEST */
5517 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5518 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5519 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5520
5521 /* Start NACC from MS side */
5522 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5523 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5524
5525 /* osmo-pcu should now ask for resolution: */
5526 f_ipa_ctrl_wait_link_up();
5527 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5528 int2str(info_ind.lac) & "." &
5529 int2str(info_ind.cell_id) & "." &
5530 int2str(req_arfcn) & "." &
5531 int2str(req_bsic);
5532 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5533 /* RIM procedure: */
5534 as_outbound_nacc_rim_resolve(info_ind);
5535
5536 /* Announce SI back to MS, continue NACC procedure */
5537 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5538
5539 /* trigger a Pkt Cell Change Notif with different tgt cell */
5540 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5541 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5542
5543 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5544 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5545
5546 /* It should trigger RAC_CI resolution to start again: */
5547 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5548 int2str(info_ind.lac) & "." &
5549 int2str(info_ind.cell_id) & "." &
5550 int2str(req_arfcn + 1) & "." &
5551 int2str(req_bsic + 1);
5552 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5553 /* RIM procedure: */
5554 as_outbound_nacc_rim_resolve(info_ind);
5555 /* Transmit SI back to MS */
5556 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5557
5558 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5559 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5560 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5561 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5562 f_shutdown(__BFILE__, __LINE__);
5563 }
5564 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5565 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5566 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5567 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5568 }
5569}
5570
5571/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5572testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5573 var PollFnCtx pollctx;
5574 var GprsMS ms;
5575 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5576 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5577 var RlcmacDlBlock dl_block;
5578 var uint32_t sched_fn;
5579 var CtrlMessage rx_ctrl;
5580 var GsmArfcn req_arfcn := 862;
5581 var uint6_t req_bsic := 43;
5582
5583 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5584 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5585
5586 /* Initialize NS/BSSGP side */
5587 f_init_bssgp();
5588 /* Initialize GPRS MS side */
5589 f_init_gprs_ms();
5590 ms := g_ms[0]; /* We only use first MS in this test */
5591
5592 /* Initialize the PCU interface abstraction */
5593 f_init_raw(testcasename(), info_ind);
5594
5595 /* Make sure we are not affected by full cache from previous tests */
5596 f_pcuvty_flush_neigh_caches();
5597
5598 /* Establish BSSGP connection to the PCU */
5599 f_bssgp_establish();
5600 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5601
5602 /* Send PACKET RESOURCE REQUEST */
5603 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5604 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5605 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5606
5607 /* Start NACC from MS side */
5608 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5609 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5610
5611 /* osmo-pcu should now ask for resolution: */
5612 f_ipa_ctrl_wait_link_up();
5613 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5614 int2str(info_ind.lac) & "." &
5615 int2str(info_ind.cell_id) & "." &
5616 int2str(req_arfcn) & "." &
5617 int2str(req_bsic);
5618 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5619 /* RIM procedure: */
5620 as_outbound_nacc_rim_resolve(info_ind);
5621
5622 /* Announce SI back to MS, continue NACC procedure */
5623 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5624
5625 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5626 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5627 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5628 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5629 f_shutdown(__BFILE__, __LINE__);
5630 }
5631
5632 /* trigger a Pkt Cell Change Notif with different tgt cell */
5633 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5634 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5635
5636 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5637 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5638 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5639 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5640 }
5641 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5642 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5643
5644 /* It should trigger RAC_CI resolution to start again: */
5645 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5646 int2str(info_ind.lac) & "." &
5647 int2str(info_ind.cell_id) & "." &
5648 int2str(req_arfcn + 1) & "." &
5649 int2str(req_bsic + 1);
5650 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5651 /* RIM procedure: */
5652 as_outbound_nacc_rim_resolve(info_ind);
5653 /* Transmit SI back to MS */
5654 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5655
5656 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5657 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5658 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5659 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5660 f_shutdown(__BFILE__, __LINE__);
5661 }
5662 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5663 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5664 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5665 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5666 }
5667}
5668
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005669/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5670testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5671 var PollFnCtx pollctx;
5672 var GprsMS ms;
5673 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5674 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5675 var RlcmacDlBlock dl_block;
5676 var uint32_t sched_fn, dl_fn;
5677 var CtrlMessage rx_ctrl;
5678 var GsmArfcn req_arfcn := 862;
5679 var uint6_t req_bsic := 43;
5680 var octetstring data := f_rnd_octstring(10);
5681
5682 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5683 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5684
5685 /* Initialize NS/BSSGP side */
5686 f_init_bssgp();
5687 /* Initialize GPRS MS side */
5688 f_init_gprs_ms();
5689 ms := g_ms[0]; /* We only use first MS in this test */
5690
5691 /* Initialize the PCU interface abstraction */
5692 f_init_raw(testcasename(), info_ind);
5693
5694 /* Make sure we are not affected by full cache from previous tests */
5695 f_pcuvty_flush_neigh_caches();
5696
5697 /* Establish BSSGP connection to the PCU */
5698 f_bssgp_establish();
5699 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5700
5701 /* Send PACKET RESOURCE REQUEST */
5702 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5703 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5704 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5705
5706 /* Start NACC from MS side */
5707 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5708 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5709
5710 /* osmo-pcu should now ask for resolution: */
5711 f_ipa_ctrl_wait_link_up();
5712 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5713 int2str(info_ind.lac) & "." &
5714 int2str(info_ind.cell_id) & "." &
5715 int2str(req_arfcn) & "." &
5716 int2str(req_bsic);
5717 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5718 /* RIM procedure: */
5719 as_outbound_nacc_rim_resolve(info_ind);
5720
5721 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5722 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5723 f_sleep(0.1);
5724 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5725 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5726
5727 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5728 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5729 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5730 * Data with unassigned DL TBF in line above): */
5731 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5732 /* Continue receiving Pkt Cell Neighbor Data */
5733 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5734
5735 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5736 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5737 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5738 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5739 f_shutdown(__BFILE__, __LINE__);
5740 }
5741 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5742 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5743 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5744 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5745 }
5746
5747 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5748 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5749 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5750 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5751 f_dl_block_ack_fn(dl_block, dl_fn));
5752}
5753
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005754
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005755function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
5756runs on RAW_PCU_Test_CT
5757{
5758 var template (value) RAN_Information_Request_RIM_Container req_cont;
5759 var template (value) PDU_BSSGP bssgp_rim_pdu;
5760 var template PDU_BSSGP bssgp_rim_pdu_expect;
5761 var template RAN_Information_RIM_Container rim_cont_expect;
5762 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005763
5764 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005765 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 +01005766 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005767 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 +01005768 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005769 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);
5770 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005771 f_sleep(1.0);
5772
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005773 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005774
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005775 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5776 ts_RIM_Sequence_Number(1),
5777 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5778 ts_RIM_Protocol_Version_Number(1),
5779 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5780 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005781 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
5782 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005783
5784 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5785 tr_RIM_Sequence_Number(1),
5786 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5787 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005788 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 +01005789 omit);
5790
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005791 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
5792 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005793 rim_cont_expect);
5794 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005795 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005796 T.start;
5797 alt {
5798 [] RIM.receive(bssgp_rim_pdu_expect) { }
5799 [] RIM.receive {
5800 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5801 }
5802 [] T.timeout {
5803 setverdict(fail, "No BSSGP RIM PDU received");
5804 mtc.stop;
5805 }
5806 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005807}
5808/* Send a RIM RAN info request to the PCU and verify the response, we expect
5809 * getting the system information back which we have transfered to the PCU via
5810 * PCUIF on startup. */
5811testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5812 /* Initialize NS/BSSGP side */
5813 f_init_bssgp();
5814
5815 /* Initialize the PCU interface abstraction */
5816 f_init_raw(testcasename());
5817
5818 /* Establish BSSGP connection to the PCU */
5819 f_bssgp_establish();
5820
5821 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
5822 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5823
5824 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5825 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
5826
5827 f_shutdown(__BFILE__, __LINE__, final := true);
5828}
5829
5830/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
5831 * Routing information, to verify PCU handles that kind of address just fine
5832 */
5833testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
5834 /* Initialize NS/BSSGP side */
5835 f_init_bssgp();
5836
5837 /* Initialize the PCU interface abstraction */
5838 f_init_raw(testcasename());
5839
5840 /* Establish BSSGP connection to the PCU */
5841 f_bssgp_establish();
5842
5843 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
5844 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
5845
5846 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
5847 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005848
5849 f_shutdown(__BFILE__, __LINE__, final := true);
5850}
5851
5852/* Same as above, but in this case we simulate the rare case in which the PCU
5853 * has no system information available. We expect getting a response back but
5854 * with no system information inside. */
5855testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005856 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005857 var PCUIF_Message pcu_msg;
5858 timer T := 2.0;
5859
5860 /* Initialize NS/BSSGP side */
5861 f_init_bssgp();
5862
5863 /* Initialize the PCU interface abstraction */
5864 f_init_raw(testcasename(), info_ind);
5865
5866 /* Establish BSSGP connection to the PCU */
5867 f_bssgp_establish();
5868
5869 /* Clear sysinfo from the PCU */
5870 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);
5871 BTS.send(si1_data_ind);
5872 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);
5873 BTS.send(si3_data_ind);
5874 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);
5875 BTS.send(si16_data_ind);
5876 f_sleep(1.0);
5877
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005878 var RIM_Routing_Address dst_addr;
5879 var RIM_Routing_Address src_addr;
5880 var template (value) RAN_Information_Request_RIM_Container req_cont;
5881 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005882 var template PDU_BSSGP bssgp_rim_pdu_expect;
5883 var template RAN_Information_RIM_Container rim_cont_expect;
5884
5885 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 +01005886 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5887 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005888
5889 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5890 ts_RIM_Sequence_Number(1),
5891 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5892 ts_RIM_Protocol_Version_Number(1),
5893 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5894 omit);
5895 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5896 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5897 req_cont);
5898
5899
5900 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5901 tr_RIM_Sequence_Number(1),
5902 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5903 tr_RIM_Protocol_Version_Number(1),
5904 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5905 omit);
5906
5907 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5908 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5909 rim_cont_expect);
5910 RIM.send(bssgp_rim_pdu);
5911 T.start;
5912 alt {
5913 [] RIM.receive(bssgp_rim_pdu_expect) { }
5914 [] RIM.receive {
5915 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5916 }
5917 [] T.timeout {
5918 setverdict(fail, "No BSSGP RIM PDU received");
5919 mtc.stop;
5920 }
5921 }
5922
5923 f_shutdown(__BFILE__, __LINE__, final := true);
5924}
5925
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005926control {
5927 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005928 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005929 execute( TC_ta_ptcch_idle() );
5930 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02005931 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005932 execute( TC_ta_idle_dl_tbf_ass() );
5933 execute( TC_ta_ptcch_ul_multi_tbf() );
5934 execute( TC_cs_lqual_ul_tbf() );
5935 execute( TC_cs_initial_ul() );
5936 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005937 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005938 execute( TC_cs_max_dl() );
5939 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005940 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005941 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005942 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005943 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02005944 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005945 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02005946 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005947 execute( TC_x2031_t3191() );
5948 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005949 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005950 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005951 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005952 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005953 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005954 execute( TC_mo_ping_pong() );
5955 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005956 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005957 execute( TC_mt_ping_pong() );
5958 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005959 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005960 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005961 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005962 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005963 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005964 execute( TC_paging_cs_from_bts() );
5965 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5966 execute( TC_paging_cs_from_sgsn_sign() );
5967 execute( TC_paging_cs_from_sgsn_ptp() );
5968 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5969 execute( TC_paging_ps_from_sgsn_sign() );
5970 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005971 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5972 execute( TC_paging_cs_multi_ms_imsi() );
5973 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005974 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5975 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005976 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5977 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005978
5979 /* EGPRS specific test cases */
5980 execute( TC_egprs_pkt_chan_req_signalling() );
5981 execute( TC_egprs_pkt_chan_req_one_phase() );
5982 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005983 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005984 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005985 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005986
5987 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005988
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005989 /* Immediate Assignment on AGCH/PCH */
5990 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5991 execute( TC_pcuif_fh_imm_ass_ul() );
5992 execute( TC_pcuif_fh_imm_ass_dl() );
5993 /* Packet Uplink/Downlink Assignment on PACCH */
5994 execute( TC_pcuif_fh_pkt_ass_ul() );
5995 execute( TC_pcuif_fh_pkt_ass_dl() );
5996 execute( TC_multitrx_multims_alloc() );
5997 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5998 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5999 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
6000
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006001 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006002
6003 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006004 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006005 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006006 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006007 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01006008 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006009 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01006010 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006011 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006012 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6013 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006014 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6015 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6016 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006017 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6018 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006019 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6020 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6021 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006022 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006023
6024 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006025 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006026 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006027}
6028
Harald Weltea419df22019-03-21 17:23:04 +01006029}