blob: a466732eb59a33ce1a4aa11884ee5d1b446ebcef [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;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020074}
75
76
77/* 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 +010078friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default(template (value) PCUIF_Flags flags := c_PCUIF_Flags_default)
79:= {
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070080 version := PCUIF_Types.mp_pcuif_version,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010081 flags := flags,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +010082 trx := ts_PCUIF_InfoTrxs_def(GPRS_Components.mp_base_arfcn),
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020083 bsic := 7,
84 mcc := 262,
85 mnc := 42,
86 mnc_3_digits := 0,
87 lac := 13135,
88 rac := 0,
89 nsei := mp_nsconfig.nsei,
90 nse_timer := { 3, 3, 3, 3, 30, 3, 10 },
91 cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },
92 cell_id := 20960,
93 repeat_time := 5 * 50,
94 repeat_count := 3,
Harald Welte5339b2e2020-10-04 22:52:56 +020095 bvci := mp_gb_cfg.bvc[0].bvci,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020096 t3142 := 20,
97 t3169 := 5,
98 t3191 := 5,
99 t3193_10ms := 160,
100 t3195 := 5,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100101 n3101 := 10,
102 n3103 := 4,
103 n3105 := 8,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200104 cv_countdown := 15,
105 dl_tbf_ext := 250 * 10, /* ms */
106 ul_tbf_ext := 250 * 10, /* ms */
107 initial_cs := 2,
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +0100108 initial_mcs := 1,
Harald Welte90f19742020-11-06 19:34:40 +0100109 nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
110 local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
111 remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100112 remote_addr := f_PCUIF_RemoteAddr(
Harald Welte90f19742020-11-06 19:34:40 +0100113 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 +0200114}
115
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100116/* Passed in RAN-INFO message from emulated neighbor using RIM */
117const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
118const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
119const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
120const octetstring si_default := si1_default & si3_default & si13_default;
121
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +0100122const MultislotCap_GPRS mscap_gprs_def := {
123 gprsmultislotclass := '00011'B,
124 gprsextendeddynalloccap := '0'B
125};
126const MultislotCap_EGPRS mscap_egprs_def := {
127 egprsmultislotclass := '00011'B,
128 egprsextendeddynalloccap := '0'B
129};
130template (value) MSRadioAccessCapabilityV ms_racap_gprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, omit) };
131template (value) MSRadioAccessCapabilityV ms_racap_egprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, mscap_egprs_def) };
132
133const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs_def := {
134 gprsmultislotclass := '00011'B,
135 gprsextendeddynalloccap := '0'B
136};
137const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs_def := {
138 egprsmultislotclass := '00011'B,
139 egprsextendeddynalloccap := '0'B
140};
141template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, omit)) };
142template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, bssgp_mscap_egprs_def)) };
143
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200144type record lqual_range {
145 /* component reference to the IPA_Client component used for RSL */
146 uint8_t low,
147 uint8_t high
148}
149
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +0100150type component RAW_PCU_Test_CT extends bssgp_CT, MS_BTS_IFACE_CT, StatsD_ConnHdlr, CTRL_Adapter_CT {
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700151 /* PCU interface abstraction component */
152 var RAW_PCUIF_CT vc_PCUIF;
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700153
Daniel Willmann535aea62020-09-21 13:27:08 +0200154 /* StatsD */
155 var StatsD_Checker_CT vc_STATSD;
156
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200157 /* Connection to the PCUIF component */
158 port RAW_PCU_MSG_PT PCUIF;
159 /* VTY connection to the PCU */
160 port TELNETasp_PT PCUVTY;
161
162 /* Uplink CS/MCS thresholds, default from pcu_main.c: */
163 var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},
164 {low := 5, high := 8},
165 {low := 7, high := 13},
166 {low := 12,high := 35}};
167 var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},
168 {low := 5, high := 8},
169 {low := 7, high := 13},
170 {low := 12,high := 15},
171 {low := 14, high := 17},
172 {low := 16, high := 18},
173 {low := 17,high := 20},
174 {low := 19, high := 24},
175 {low := 23,high := 35}};
176 var uint8_t g_cs_initial_dl := 1;
177 var uint8_t g_cs_initial_ul := 1;
178 var uint8_t g_mcs_initial_dl := 1;
179 var uint8_t g_mcs_initial_ul := 1;
180 var uint8_t g_cs_max_dl := 4;
181 var uint8_t g_cs_max_ul := 4;
182 var uint8_t g_mcs_max_dl := 9;
183 var uint8_t g_mcs_max_ul := 9;
184
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200185 var boolean g_force_two_phase_access := false;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200186
187 /* Guard timeout */
188 timer g_T_guard := 60.0;
189};
190
191private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
192 [] g_T_guard.timeout {
193 setverdict(fail, "Timeout of T_guard");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700194 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200195 }
196}
197
198private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {
199 f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));
200 f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));
201
202 f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));
203 f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));
204}
205
206private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {
207 var charstring cmd;
208
209 cmd := "cs link-quality-ranges" &
210 " cs1 " & int2str(g_cs_lqual_ranges[0].high) &
211 " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &
212 " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &
213 " cs4 " & int2str(g_cs_lqual_ranges[3].low);
214 f_vty_config2(PCUVTY, {"pcu"}, cmd);
215
216 cmd := "mcs link-quality-ranges" &
217 " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &
218 " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &
219 " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &
220 " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &
221 " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &
222 " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &
223 " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &
224 " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &
225 " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);
226 f_vty_config2(PCUVTY, {"pcu"}, cmd);
227}
228
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100229private function f_pcuvty_flush_neigh_caches() runs on RAW_PCU_Test_CT {
230 f_pcuvty_set_neigh_caches(0, 0);
231}
232
233private function f_pcuvty_set_neigh_caches(integer neigh_cache_secs := -1, integer si_cache_secs := -1)
234runs on RAW_PCU_Test_CT {
235 if (neigh_cache_secs == -1) {
236 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 default");
237 } else {
238 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 " & int2str(neigh_cache_secs));
239 }
240 if (si_cache_secs == -1) {
241 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 default");
242 } else {
243 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 " & int2str(si_cache_secs));
244 }
245}
246
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100247private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200248 map(self:PCUVTY, system:PCUVTY);
249 f_vty_set_prompts(PCUVTY);
250 f_vty_transceive(PCUVTY, "enable");
251
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100252 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
253 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200254 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
255 } else {
256 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
257 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200258
259 if (g_force_two_phase_access) {
260 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
261 } else {
262 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
263 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200264}
265
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200266function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200267runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200268 /* Start the guard timer */
269 g_T_guard.start;
270 activate(as_Tguard_RAW());
271
272 /* Init PCU interface component */
Harald Welte5339b2e2020-10-04 22:52:56 +0200273 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200274 connect(vc_PCUIF:MTC, self:PCUIF);
275 map(vc_PCUIF:PCU, system:PCU);
276
277 /* Create one BTS component (we may want more some day) */
Harald Welte5339b2e2020-10-04 22:52:56 +0200278 vc_BTS := RAW_PCU_BTS_CT.create("BTS");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200279 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
280 connect(vc_BTS:TC, self:BTS);
281
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100282 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200283
Daniel Willmann535aea62020-09-21 13:27:08 +0200284 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
285 /* This is normally done in the ConnHdlr component, but here
286 * the Test_CT doubles as ConnHdlr */
287 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
288
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200289 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100290 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200291
292 /* Wait until the BTS is ready (SI13 negotiated) */
293 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
294}
295
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700296/* Register TLLI of each allocated GprsMS instance */
297private function f_multi_ms_bssgp_register()
298runs on RAW_PCU_Test_CT {
299 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
301 }
302}
303
304/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
305private function f_multi_ms_establish_tbf(boolean do_activate := false)
306runs on RAW_PCU_Test_CT {
307 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
308 /* Establish an Uplink TBF */
309 f_ms_establish_ul_tbf(g_ms[i]);
310
311 /* Send a random block, so this TBF becomes "active" */
312 if (do_activate) {
313 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100314 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700315 var octetstring dummy := f_rnd_octstring(12);
316 var RlcmacDlBlock dl_block;
317 var uint32_t poll_fn;
318
319 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, nr := nr);
320 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
321 }
322 }
323}
324
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100325private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
326 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
327runs on RAW_PCU_Test_CT return PollFnCtx {
328 var PollFnCtx pollctx;
329
330 /* Single block (two phase) packet access */
331 var uint16_t ra := bit2int(chan_req_sb);
332 if (g_force_two_phase_access) {
333 /* If 2phase access is enforced by the network, then let's
334 * request a One phase packet access, we'll receive a single block
335 * anyway
336 */
337 ra := bit2int(chan_req_def);
338 }
339
340 /* Establish an Uplink TBF */
341 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
342 f_ms_establish_ul_tbf(ms);
343
344 /* Make sure we've got an Uplink TBF assignment */
345 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
346 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
347 f_shutdown(__BFILE__, __LINE__);
348 }
349
350 /* Send PACKET RESOURCE REQUEST
351 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
352 */
353 if (istemplatekind(pkt_res_req, "omit")) {
354 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
355 }
356
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100357 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
358 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100359 * overwrite the TS allocation on MS with info from new UL TBF:
360 */
361 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
362 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
363 return pollctx;
364}
365
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200366testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200367 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100368 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200369 timer T;
370
371 /* Initialize NS/BSSGP side */
372 f_init_bssgp();
373
374 /* Initialize the PCU interface abstraction */
375 f_init_raw(testcasename());
376
377 /* Establish BSSGP connection to the PCU */
378 f_bssgp_establish();
379
380 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
381
382 T.start(2.0);
383 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100384 [] 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 +0200385 setverdict(pass);
386 }
387 [] T.timeout {
388 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
389 }
390 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700391
392 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200393}
394
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100395/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
396testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
397 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
398 var RlcmacDlBlock dl_block;
399 var octetstring data := f_rnd_octstring(10);
400 var uint32_t sched_fn;
401 var uint32_t dl_fn;
402 var GprsMS ms;
403 timer T;
404
405 /* Initialize NS/BSSGP side */
406 f_init_bssgp();
407 /* Initialize GPRS MS side */
408 f_init_gprs_ms();
409 ms := g_ms[0]; /* We only use first MS in this test */
410
411 /* Initialize the PCU interface abstraction */
412 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
413
414 /* Establish BSSGP connection to the PCU */
415 f_bssgp_establish();
416 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
417
418 /* Establish an Uplink TBF */
419 f_ms_establish_ul_tbf(ms);
420
421 /* Send one UL block (with TLLI since we are in One-Phase Access
422 contention resoultion) and make sure it is ACKED fine */
423 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
424 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
425 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
426 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
427
428 /* UL block should be received in SGSN */
429 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
430
431 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
432 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
433 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
434
435 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
436 f_sleep(X2002);
437 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
438
439 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
440 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
441
442 T.start(2.0);
443 alt {
444 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
445 setverdict(pass);
446 }
447 [] T.timeout {
448 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
449 f_shutdown(__BFILE__, __LINE__);
450 }
451 }
452
453 /* Make sure we don't receive data for that TBF since it was released
454 * before. Also check our TBF is not polled for UL. */
455 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
456 if (dl_block.ctrl.mac_hdr.usf != USF_UNUSED) {
457 setverdict(fail, "Unexpected USF ", dl_block.ctrl.mac_hdr.usf);
458 f_shutdown(__BFILE__, __LINE__);
459 }
460
461 /* New data arrives, PCU should page the MS since no TBF active exists: */
462 /* Send some more data, it will never reach the MS */
463 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
464 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
465
466 f_shutdown(__BFILE__, __LINE__, final := true);
467}
468
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200469/* Test of correct Timing Advance at the time of TBF establishment
470 * (derived from timing offset of the Access Burst). */
471testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200472 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200473
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200474 /* Initialize GPRS MS side */
475 f_init_gprs_ms();
476 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200477 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100478 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200479
480 /* We cannot send too many TBF requests in a short time because
481 * at some point the PCU will fail to allocate a new TBF. */
482 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
483 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200484 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700485 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200486
487 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200488 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700489 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200490 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700491 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700492 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200493 }
494 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700495
496 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200497}
498
499/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
500 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
501 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
502 * no active TBF exists at the moment of establishment (idle mode). */
503testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100504 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200505
506 /* Initialize NS/BSSGP side */
507 f_init_bssgp();
508
509 /* Initialize the PCU interface abstraction */
510 f_init_raw(testcasename());
511
512 /* Establish BSSGP connection to the PCU */
513 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100514 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200515
516 /* SGSN sends some DL data, PCU will initiate Packet Downlink
517 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100518 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
519 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200520
521 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
522 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
523 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100524 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700525 setverdict(fail, "Timing Advance value doesn't match");
526 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700527
528 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200529}
530
531/* Verify that the PCU generates valid PTCCH/D messages
532 * while neither Uplink nor Downlink TBF is established. */
533testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100534 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200535 timer T;
536
537 /* Initialize the PCU interface abstraction */
538 f_init_raw(testcasename());
539
540 /* Sent an RTS.req for PTCCH/D */
541 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
542 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
543 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100544
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200545 T.start(5.0);
546 alt {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100547 /* Make sure the message is encoded correctly
548 * TODO: do we expect all TA values to be equal '1111111'B? */
549 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg);
550
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200551 [] BTS.receive(PCUIF_Message:?) { repeat; }
552 [] T.timeout {
553 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700554 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200555 }
556 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100557 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700558
559 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200560}
561
562/* Test of correct Timing Advance during an active Uplink TBF.
563 *
564 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
565 * are not continuous and there can be long time gaps between them. This happens
566 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
567 * significantly change between such rare Uplink transmissions, so GPRS introduces
568 * additional mechanisms to control Timing Advance, and thus reduce interference
569 * between neighboring TDMA time-slots.
570 *
571 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
572 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
573 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
574 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
575 * among with the initial Timing Advance value. And here PTCCH comes to play.
576 *
577 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
578 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
579 * continuously. To ensure continuous measurements of the signal propagation
580 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
581 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
582 *
583 * The purpose of this test case is to verify the assignment of Timing Advance
584 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
585 * first establishes several Uplink TBFs, but does not transmit any Uplink
586 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
587 * indications to the PCU, checking the correctness of two received PTCCH/D
588 * messages (period of PTCCH/D is two multi-frames).
589 */
590
591/* List of ToA values for Access Bursts to be sent on PTCCH/U,
592 * each ToA (Timing of Arrival) value is in units of 1/4 of
593 * a symbol (i.e. 1 symbol is 4 QTA units). */
594type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
595const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
596 0, 0, 0, 0,
597 0, 0, 0, 0,
598 0, 0, 0, 0,
599 0, 0, 0, 0
600};
601
602private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
603 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
604runs on RAW_PCU_Test_CT {
605 var RAW_PCU_Event event;
606 var integer ss;
607
608 /* Send Access Bursts on PTCCH/U for every TA Index */
609 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
610 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700611 if (ss < 0) { /* Shall not happen */
612 f_shutdown(__BFILE__, __LINE__);
613 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200614
615 log("Sending an Access Burst on PTCCH/U",
616 ", sub-slot=", ss, " (TAI)",
617 ", fn=", event.data.tdma_fn,
618 ", ToA=", toa_map[ss], " (QTA)");
619 /* TODO: do we care about RA and burst format? */
620 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
621 ra := oct2int('3A'O),
622 is_11bit := 0,
623 burst_type := BURST_TYPE_0,
624 fn := event.data.tdma_fn,
625 arfcn := 871,
626 qta := toa_map[ss],
627 sapi := PCU_IF_SAPI_PTCCH));
628 repeat;
629 }
630}
631
632private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
633 template PTCCHDownlinkMsg t_ta_msg)
634runs on RAW_PCU_Test_CT {
635 var PTCCHDownlinkMsg ta_msg;
636 var PCUIF_Message pcu_msg;
637 timer T;
638
639 /* First, send an RTS.req for the upcoming PTCCH/D block */
640 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
641 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
642 arfcn := 871, block_nr := 0));
643 T.start(2.0);
644 alt {
645 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
646 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
647 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
648 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
649 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
650 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
651 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
652 log("Rx PTCCH/D message: ", ta_msg);
653
654 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700655 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200656 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
657 }
658 }
659 [] BTS.receive { repeat; }
660 [] T.timeout {
661 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200662 }
663 }
664}
665
666testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
667 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200668 var GprsMS ms;
669
670 /* Initialize GPRS MS side */
671 f_init_gprs_ms();
672 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200673
674 /* Initialize the PCU interface abstraction */
675 f_init_raw(testcasename());
676
677 /* Enable forwarding of PTCCH/U TDMA events to us */
678 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
679
680 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
681 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200682 /* Establish an Uplink TBF */
683 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200684
685 /* We expect incremental TFI/USF assignment (dynamic allocation) */
686 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200687 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200688 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700689 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200690 }
691
692 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200693 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200694 setverdict(fail, "Failed to match Timing Advance Index for #", i);
695 /* Keep going, the current OsmoPCU does not assign TA Index */
696 }
697 }
698
699 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
700 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
701 for (var integer i := 0; i < 7; i := i + 1) {
702 /* ToA in units of 1/4 of a symbol */
703 toa_map[i] := (i + 1) * 7 * 4;
704 }
705
706 /* Now we have all 7 TBFs established in one-phase access mode,
707 * however we will not be sending any data on them. Instead, we
708 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
709 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
710 *
711 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
712 * time-slots, so at the moment of scheduling a PTCCH/D block
713 * the PCU has odd number of PTCCH/U Access Bursts received. */
714 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
715 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
716 /* Other values are not known (yet) */
717 tai3_ta := ?));
718 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
719 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
720 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
721 /* Other values are out of our interest */
722 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700723
724 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200725}
726
727/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
728 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
729 *
730 * NOTE: the ranges are intentionally overlapping because OsmoPCU
731 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
732private template integer CS1_lqual_dB_range := (-infinity .. 6);
733private template integer CS2_lqual_dB_range := (5 .. 8);
734private template integer CS3_lqual_dB_range := (7 .. 13);
735private template integer CS4_lqual_dB_range := (12 .. infinity);
736
737testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200738 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200739 var GprsMS ms;
740 var uint32_t unused_fn, sched_fn;
741 var uint4_t cv;
742
743 /* Initialize GPRS MS side */
744 f_init_gprs_ms();
745 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200746
747 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100748 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200749
750 f_pcuvty_set_allowed_cs_mcs();
751 f_pcuvty_set_link_quality_ranges();
752
753 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200754 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200755
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200756
757 /* The actual / old link quality values. We need to keep track of the old
758 * (basically previous) link quality value, because OsmoPCU actually
759 * changes the coding scheme if not only the actual, but also the old
760 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200761 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200762 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200763
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200764 /* Send one UL block (with TLLI since we are in One-Phase Access
765 contention resoultion) and make sure it is ACKED fine. */
766 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
767 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
768 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
769 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
770 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
771 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200772
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200773 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
774 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200775 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200776 lqual_old := ms.lqual_cb;
777 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200778
779 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200780 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
781 if (i > g_bs_cv_max) {
782 cv := 15;
783 } else {
784 cv := i;
785 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200786
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200787 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
788
789 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
790 f_rx_rlcmac_dl_block(dl_block, unused_fn);
791 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
792 continue;
793 }
794 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
795 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
796 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
797 f_shutdown(__BFILE__, __LINE__);
798 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799
800 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
801 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
802
803 /* Match the received Channel Coding Command. Since we are increasing
804 * the link quality value on each iteration and not decreasing, there
805 * is no need to check the both old and current link quality values. */
806 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200807 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
809 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
810 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
811 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
812 }
813
814 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
815 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200816 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200817 }
818 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700819
820 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200821}
822
823/* Test the max UL CS set by VTY works fine */
824testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200826 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200827 var uint32_t unused_fn, sched_fn;
828 var GprsMS ms;
829
830 /* Initialize GPRS MS side */
831 f_init_gprs_ms();
832 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
834 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100835 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200836
837 /* Set initial UL CS to 3 */
838 g_cs_initial_ul := 3;
839 f_pcuvty_set_allowed_cs_mcs();
840 f_pcuvty_set_link_quality_ranges();
841
842 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200844
845 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200846 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200847
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200848 /* Send one UL block (with TLLI since we are in One-Phase Access
849 contention resoultion) and make sure it is ACKED fine. */
850 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
851 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
852 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
853 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
854 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
855 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200856
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200857 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
858 while (true) {
859 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
860 f_rx_rlcmac_dl_block(dl_block, unused_fn);
861 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
862 continue;
863 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200864
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200865 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
866 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
867 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
868 f_shutdown(__BFILE__, __LINE__);
869 break;
870 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200871
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200872 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200873 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200874 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200875 if (last_ch_coding != CH_CODING_CS3) {
876 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200877 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 }
879
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200880 /* Remaining UL blocks are used to make sure regardless of initial
881 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200882 /* 0 dB, make sure we downgrade CS */
883 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200884 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200885 f_ms_tx_ul_data_block_multi(ms, 5);
886 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
887 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
888 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200889
890 if (last_ch_coding != CH_CODING_CS1) {
891 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200892 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200893 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700894
895 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200896}
897
898/* Test the max UL CS set by VTY works fine */
899testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200901 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200902 var uint32_t unused_fn, sched_fn;
903 var GprsMS ms;
904
905 /* Initialize GPRS MS side */
906 f_init_gprs_ms();
907 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200908
909 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100910 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200911
912 /* Set maximum allowed UL CS to 3 */
913 g_cs_max_ul := 3;
914 f_pcuvty_set_allowed_cs_mcs();
915 f_pcuvty_set_link_quality_ranges();
916
917 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200919
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 /* Send one UL block (with TLLI since we are in One-Phase Access
921 contention resoultion) and make sure it is ACKED fine. */
922 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
923 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
924 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
925 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
926 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
927 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200928
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200929 ms.lqual_cb := 40*10; /* 40 dB */
930 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200931
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
933 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200934
935 if (last_ch_coding != CH_CODING_CS3) {
936 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200937 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200938 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700939
940 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941}
942
Pau Espin Pedrol75122592020-11-03 15:22:59 +0100943/* Test the initial DL CS set by VTY works fine */
944testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
945 var octetstring data := f_rnd_octstring(10);
946 var CodingScheme exp_dl_cs_mcs;
947 var RlcmacDlBlock dl_block;
948 var uint32_t poll_fn;
949 var GprsMS ms;
950
951 /* Initialize NS/BSSGP side */
952 f_init_bssgp();
953 /* Initialize GPRS MS side */
954 f_init_gprs_ms();
955 ms := g_ms[0]; /* We only use first MS in this test */
956
957 /* Initialize the PCU interface abstraction */
958 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
959
960 /* Set initial allowed DL CS to 3 */
961 g_cs_initial_dl := 3;
962 exp_dl_cs_mcs := CS_3;
963 /* Set maximum allowed UL CS to 4 */
964 g_cs_max_dl := 4;
965 f_pcuvty_set_allowed_cs_mcs();
966 f_pcuvty_set_link_quality_ranges();
967
968 /* Establish BSSGP connection to the PCU */
969 f_bssgp_establish();
970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
971
972 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
973 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
974 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
975
976 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
977 f_sleep(X2002);
978 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
979
980 /* ACK the DL block */
981 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
982 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
983 f_dl_block_ack_fn(dl_block, poll_fn));
984
985 f_shutdown(__BFILE__, __LINE__, final := true);
986}
987
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100988/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100989function 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 +0100990 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100991 var RlcmacDlBlock prev_dl_block, dl_block;
992 var uint32_t ack_fn;
993 var uint32_t fn;
994 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100995 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100996 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100997 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
998 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100999 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001000
1001 if (using_egprs) {
1002 exp_tmp_csmcs := mcs_egprs_any;
1003 bsn_mod := 2048;
1004 } else {
1005 exp_tmp_csmcs := cs_gprs_any;
1006 bsn_mod := 128;
1007 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001008
1009 /* Establish BSSGP connection to the PCU */
1010 f_bssgp_establish();
1011
1012 ms := g_ms[0]; /* We only use first MS in this test */
1013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1014
1015 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001016 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001017 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1018
1019 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1020 f_sleep(X2002);
1021
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001022 for (var integer i := 0; i < 800; i := i + 1) {
1023 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001024 f_rx_rlcmac_dl_block(dl_block, fn);
1025
1026 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1027 /* No more data to receive, done */
1028 break;
1029 }
1030
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001031 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001032
1033 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001034 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001035
1036 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001037 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001038 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001039 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 +01001040 if (tx_data_remain != 0) {
1041 /* Submit more data from time to time to keep the TBF ongoing */
1042 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1043 tx_data_remain := tx_data_remain - 1;
1044 }
1045 }
1046 prev_dl_block := dl_block;
1047 }
1048
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001049 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1050 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001051
1052
1053 f_shutdown(__BFILE__, __LINE__, final := true);
1054}
1055
1056/* Verify DL CS above "cs max" set by VTY is never used */
1057testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1058 /* Initialize NS/BSSGP side */
1059 f_init_bssgp();
1060 /* Initialize GPRS MS side */
1061 f_init_gprs_ms();
1062
1063 /* Initialize the PCU interface abstraction */
1064 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1065
1066 /* Set maximum allowed DL CS to 3 */
1067 g_cs_initial_dl := 1;
1068 g_cs_max_dl := 3;
1069 f_pcuvty_set_allowed_cs_mcs();
1070 f_pcuvty_set_link_quality_ranges();
1071
1072 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1073}
1074
1075/* Check DL CS4 is used in good link conditions if allowed by config */
1076testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1077 /* Initialize NS/BSSGP side */
1078 f_init_bssgp();
1079 /* Initialize GPRS MS side */
1080 f_init_gprs_ms();
1081
1082 /* Initialize the PCU interface abstraction */
1083 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1084
1085 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1086 g_cs_initial_dl := 1;
1087 g_cs_max_dl := 4;
1088 f_pcuvty_set_allowed_cs_mcs();
1089 f_pcuvty_set_link_quality_ranges();
1090
1091 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1092}
1093
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001094/* Test the initial UL MCS set by VTY works fine */
1095testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1096 var RlcmacDlBlock dl_block;
1097 var PollFnCtx pollctx;
1098 var EgprsChCodingCommand last_ch_coding;
1099 var uint32_t unused_fn, sched_fn;
1100 var GprsMS ms;
1101 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001102
1103 /* Initialize GPRS MS side */
1104 f_init_gprs_ms();
1105 ms := g_ms[0]; /* We only use first MS in this test */
1106
1107 /* Initialize the PCU interface abstraction */
1108 f_init_raw(testcasename());
1109
1110 /* Set initial UL MCS to 3 */
1111 g_mcs_initial_ul := 3;
1112 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1113 f_pcuvty_set_allowed_cs_mcs();
1114 f_pcuvty_set_link_quality_ranges();
1115
1116 /* Take lqual (dB->cB) so that we stay in that MCS */
1117 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1118
1119 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001120 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 +01001121
1122 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1123 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1124 f_shutdown(__BFILE__, __LINE__);
1125 }
1126
1127 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1129
1130 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1131 while (true) {
1132 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1133 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1134 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1135 continue;
1136 }
1137
1138 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1139 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1140 f_shutdown(__BFILE__, __LINE__);
1141 break;
1142 }
1143
1144 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1145 break;
1146 }
1147 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1148 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1149 f_shutdown(__BFILE__, __LINE__);
1150 }
1151
1152 /* Remaining UL blocks are used to make sure regardless of initial
1153 * lqual, we can go lower at any time
1154 * 0 dB, make sure we downgrade MCS */
1155 ms.lqual_cb := 0;
1156 /* 5 UL blocks, check we are in same initial MCS: */
1157 f_ms_tx_ul_data_block_multi(ms, 5);
1158 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1159 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1160 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1161
1162 if (last_ch_coding != CH_CODING_MCS1) {
1163 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1164 f_shutdown(__BFILE__, __LINE__);
1165 }
1166
1167 f_shutdown(__BFILE__, __LINE__, final := true);
1168}
1169
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001170/* Test the maximum UL MCS set by VTY works fine */
1171testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1172 var RlcmacDlBlock dl_block;
1173 var EgprsChCodingCommand last_ch_coding;
1174 var PollFnCtx pollctx;
1175 var uint32_t unused_fn, sched_fn;
1176 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001177
1178 /* Initialize GPRS MS side */
1179 f_init_gprs_ms();
1180 ms := g_ms[0]; /* We only use first MS in this test */
1181
1182 /* Initialize the PCU interface abstraction */
1183 f_init_raw(testcasename());
1184
1185 /* Set maximum allowed UL MCS to 5 */
1186 g_mcs_max_ul := 5;
1187 f_pcuvty_set_allowed_cs_mcs();
1188 f_pcuvty_set_link_quality_ranges();
1189
1190 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001191 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 +01001192 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1193 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1194
1195 ms.lqual_cb := 40*10; /* 40 dB */
1196 f_ms_tx_ul_data_block_multi(ms, 16);
1197
1198 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1199 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1200
1201 if (last_ch_coding != CH_CODING_MCS5) {
1202 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1203 f_shutdown(__BFILE__, __LINE__);
1204 }
1205
1206 f_shutdown(__BFILE__, __LINE__, final := true);
1207}
1208
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001209/* Test the initial DL CS set by VTY works fine */
1210testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1211 var octetstring data := f_rnd_octstring(10);
1212 var CodingScheme exp_dl_cs_mcs;
1213 var RlcmacDlBlock dl_block;
1214 var uint32_t poll_fn;
1215 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001216
1217 /* Initialize NS/BSSGP side */
1218 f_init_bssgp();
1219 /* Initialize GPRS MS side */
1220 f_init_gprs_ms();
1221 ms := g_ms[0]; /* We only use first MS in this test */
1222
1223 /* Initialize the PCU interface abstraction */
1224 f_init_raw(testcasename());
1225
1226 /* Set initial allowed DL MCS to 3 */
1227 g_mcs_initial_dl := 3;
1228 exp_dl_cs_mcs := MCS_3;
1229 /* Set maximum allowed DL MCS to 4 */
1230 g_mcs_max_dl := 4;
1231 f_pcuvty_set_allowed_cs_mcs();
1232 f_pcuvty_set_link_quality_ranges();
1233
1234 /* Establish BSSGP connection to the PCU */
1235 f_bssgp_establish();
1236 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1237
1238 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001239 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001240 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1241
1242 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1243 f_sleep(X2002);
1244 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1245
1246 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001247 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1248 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 +01001249 f_dl_block_ack_fn(dl_block, poll_fn));
1250
1251 f_shutdown(__BFILE__, __LINE__, final := true);
1252}
1253
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001254/* Verify DL MCS above "mcs max" set by VTY is never used */
1255testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1256 /* Initialize NS/BSSGP side */
1257 f_init_bssgp();
1258 /* Initialize GPRS MS side */
1259 f_init_gprs_ms();
1260
1261 /* Initialize the PCU interface abstraction */
1262 f_init_raw(testcasename());
1263
1264 /* Set maximum allowed DL CS to 3 */
1265 g_mcs_initial_dl := 1;
1266 g_mcs_max_dl := 3;
1267 f_pcuvty_set_allowed_cs_mcs();
1268 f_pcuvty_set_link_quality_ranges();
1269
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001270 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 +01001271}
1272
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001273/* Verify PCU drops TBF after some time of inactivity. */
1274testcase TC_t3169() runs on RAW_PCU_Test_CT {
1275 var PCUIF_info_ind info_ind;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001276 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001277 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001278 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001279
1280 /* Initialize NS/BSSGP side */
1281 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001282 /* Initialize GPRS MS side */
1283 f_init_gprs_ms();
1284 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001285
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001286 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001287 /* Set timer to 1 sec (default 5) to speedup test: */
1288 info_ind.t3169 := 1;
1289
1290 /* Initialize the PCU interface abstraction */
1291 f_init_raw(testcasename(), info_ind);
1292
1293 /* Establish BSSGP connection to the PCU */
1294 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001295 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001296
1297 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001298 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001299
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001300 /* Send one UL block (with TLLI since we are in One-Phase Access
1301 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001302 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 1, with_tlli := true)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001303 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001304 /* UL block should NOT be received in SGSN, since we didn't get CV=0 */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001305
1306 /* Wait until T3169 fires (plus 1 extra sec to make sure) */
1307 f_sleep(int2float(info_ind.t3169) + 1.0);
1308
1309 /* Send an UL block once again, the TBF should be gone by now so no ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001310 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 0)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001311 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001312
1313 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001314}
1315
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001316/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1317 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1318 * T3169. See OS#5033 */
1319testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1320 var PCUIF_info_ind info_ind;
1321 var template (value) TsTrxBtsNum nr;
1322 var BTS_PDTCH_Block data_msg;
1323 var GprsMS ms;
1324 var uint3_t rx_usf;
1325 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1326 var integer n3101 := 0;
1327 timer T_3169 := 1.0;
1328
1329 /* Initialize NS/BSSGP side */
1330 f_init_bssgp();
1331 /* Initialize GPRS MS side */
1332 f_init_gprs_ms();
1333 ms := g_ms[0]; /* We only use first MS in this test */
1334
1335 /* Initialize the PCU interface abstraction */
1336 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1337 info_ind.n3101 := N3101_MAX;
1338 info_ind.t3169 := 1;
1339 f_init_raw(testcasename(), info_ind);
1340
1341 /* Establish BSSGP connection to the PCU */
1342 f_bssgp_establish();
1343 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1344
1345 /* Establish UL TBF */
1346 f_ms_establish_ul_tbf(ms);
1347
1348 /* Now we wait for PCU to transmit our USF */
1349 nr := ts_TsTrxBtsNum;
1350 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1351 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1352 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1353 block_nr := nr.blk_nr));
1354
1355 alt {
1356 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1357 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1358 ?)) -> value data_msg {
1359 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1360 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1361 f_shutdown(__BFILE__, __LINE__);
1362 }
1363
1364 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1365 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1366 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1367 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001368 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1369 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001370 f_shutdown(__BFILE__, __LINE__);
1371 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001372 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001373 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1374 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1375 if (not T_3169.running) {
1376 log("T3169 started");
1377 T_3169.start;
1378 }
1379 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1380 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1381 f_shutdown(__BFILE__, __LINE__);
1382 } else {
1383 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1384 }
1385 nr := ts_TsTrxBtsNum;
1386 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1387 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1388 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1389 block_nr := nr.blk_nr));
1390 repeat;
1391 }
1392 [] T_3169.timeout {
1393 log("T_3169 expired");
1394 /* Done in alt */
1395 }
1396 [] BTS.receive {
1397 setverdict(fail, "Unexpected BTS message");
1398 f_shutdown(__BFILE__, __LINE__);
1399 }
1400 }
1401
1402 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1403 /* USFs as per previous TBF since they were freed at expiration time: */
1404 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1405 var uint5_t old_tfi := ms.ul_tbf.tfi;
1406 f_ms_establish_ul_tbf(ms);
1407 if (old_tfi != ms.ul_tbf.tfi) {
1408 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1409 f_shutdown(__BFILE__, __LINE__);
1410 }
1411 for (var integer i := 0; i < 8; i := i +1) {
1412 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1413 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1414 f_shutdown(__BFILE__, __LINE__);
1415 }
1416 }
1417
1418 f_shutdown(__BFILE__, __LINE__, final := true);
1419}
1420
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001421
1422/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1423 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1424 the final UL ACK sent at us. */
1425testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1426 var PCUIF_info_ind info_ind;
1427 var BTS_PDTCH_Block data_msg;
1428 var RlcmacDlBlock dl_block;
1429 var uint32_t sched_fn;
1430 var template (value) TsTrxBtsNum nr;
1431 var template RlcmacDlBlock exp_ul_ack;
1432 var template UlAckNackGprs exp_ul_ack_sub;
1433 var GprsMS ms;
1434 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1435 var integer N3103 := 0;
1436 timer T_3169 := 1.0;
1437
1438 /* Initialize GPRS MS side */
1439 f_init_gprs_ms();
1440 ms := g_ms[0]; /* We only use first MS in this test */
1441
1442 /* Initialize the PCU interface abstraction */
1443 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1444 info_ind.n3103 := N3103_MAX;
1445 info_ind.t3169 := 1;
1446 f_init_raw(testcasename(), info_ind);
1447
1448 /* Establish an Uplink TBF */
1449 f_ms_establish_ul_tbf(ms);
1450
1451 f_ms_tx_ul_data_block_multi(ms, 5);
1452 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1453 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1454
1455 nr := ts_TsTrxBtsNum;
1456 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1457 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1458 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1459 block_nr := nr.blk_nr));
1460 alt {
1461 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1462 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1463 exp_ul_ack)) -> value data_msg {
1464 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1465 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1466 f_shutdown(__BFILE__, __LINE__);
1467 }
1468
1469 nr := ts_TsTrxBtsNum;
1470 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1471 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1472 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1473 block_nr := nr.blk_nr));
1474 N3103 := N3103 + 1;
1475 if (N3103 == N3103_MAX) {
1476 /* At this point in time (N3103_MAX reached), PCU is
1477 * moving the TBF to RELEASE state so no data/ctrl for
1478 * it is tx'ed, hence the dummy blocks: */
1479 T_3169.start;
1480 }
1481 repeat;
1482 }
1483 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1484 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1485 exp_ul_ack)) -> value data_msg {
1486 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1487 f_shutdown(__BFILE__, __LINE__);
1488 }
1489 [] as_ms_rx_ignore_dummy(ms, nr);
1490 [T_3169.running] T_3169.timeout {
1491 log("T_3169 timeout");
1492 /* Done in alt, wait for pending RTS initiated previously in
1493 * above case before continuing (expect /* Dummy block): */
1494 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1495 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1496 tr_RLCMAC_DUMMY_CTRL));
1497 }
1498 [] BTS.receive {
1499 setverdict(fail, "Unexpected BTS message");
1500 f_shutdown(__BFILE__, __LINE__);
1501 }
1502 }
1503
1504 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1505 * USFs as per previous TBF since they were freed at expiration time: */
1506 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1507 var uint5_t old_tfi := ms.ul_tbf.tfi;
1508 f_ms_establish_ul_tbf(ms);
1509 if (old_tfi != ms.ul_tbf.tfi) {
1510 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1511 f_shutdown(__BFILE__, __LINE__);
1512 }
1513 for (var integer i := 0; i < 8; i := i +1) {
1514 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1515 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1516 f_shutdown(__BFILE__, __LINE__);
1517 }
1518 }
1519
1520 f_shutdown(__BFILE__, __LINE__, final := true);
1521}
1522
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001523/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1524 * point the TBF is no longer available. In order to get to start of T3191, we
1525 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1526 * until TBF release procedure starts after draining DL queue. */
1527testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1528 var PCUIF_info_ind info_ind;
1529 var RlcmacDlBlock dl_block;
1530 var octetstring data1 := f_rnd_octstring(200);
1531 var octetstring data2 := f_rnd_octstring(10);
1532 var uint32_t dl_fn;
1533 var template (value) TsTrxBtsNum nr;
1534 var BTS_PDTCH_Block data_msg;
1535 var GprsMS ms;
1536
1537 /* Initialize NS/BSSGP side */
1538 f_init_bssgp();
1539 /* Initialize GPRS MS side */
1540 f_init_gprs_ms();
1541 ms := g_ms[0]; /* We only use first MS in this test */
1542
1543 /* Initialize the PCU interface abstraction */
1544 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1545 /* Set timer to 1 sec (default 5) to speedup test: */
1546 info_ind.t3191 := 1;
1547 f_init_raw(testcasename(), info_ind);
1548
1549 /* Establish BSSGP connection to the PCU */
1550 f_bssgp_establish();
1551 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1552
1553 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1554 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1555 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1556
1557 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1558 f_sleep(X2002);
1559
1560 while (true) {
1561 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1562
1563 /* Keep Ack/Nack description updated (except for last BSN) */
1564 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1565
1566 if (f_dl_block_rrbp_valid(dl_block)) {
1567 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1568 f_dl_block_ack_fn(dl_block, dl_fn));
1569 break;
1570 }
1571 }
1572
1573 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1574 nr := ts_TsTrxBtsNum;
1575 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1576 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1577 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1578 block_nr := nr.blk_nr));
1579 alt {
1580 [] as_ms_rx_ignore_dummy(ms, nr);
1581 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1582 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1583 ?)) -> value data_msg {
1584 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1585 log("Received FINAL_ACK");
1586 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1587 break;
1588 }
1589 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1590 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1591 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1592 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1593 }
1594 nr := ts_TsTrxBtsNum;
1595 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1596 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1597 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1598 block_nr := nr.blk_nr));
1599 repeat;
1600 }
1601 [] BTS.receive {
1602 setverdict(fail, "Unexpected BTS message");
1603 f_shutdown(__BFILE__, __LINE__);
1604 }
1605 }
1606
1607 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1608 to time out. We simply sleep instead of requesting blocks because
1609 otherwise retransmissions would keep restarting the timer. */
1610 f_sleep(int2float(info_ind.t3191));
1611
1612 /* The TBF should be freed now, so new data should trigger an Assignment: */
1613 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1614 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1615
1616 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1617 f_sleep(X2002);
1618 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1619 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1620 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1621 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1622 f_dl_block_ack_fn(dl_block, dl_fn));
1623
1624 f_shutdown(__BFILE__, __LINE__, final := true);
1625}
1626
1627/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1628testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1629 var PCUIF_info_ind info_ind;
1630 var RlcmacDlBlock dl_block;
1631 var octetstring data1 := f_rnd_octstring(1400);
1632 var octetstring data2 := f_rnd_octstring(10);
1633 var uint32_t dl_fn;
1634 var GprsMS ms;
1635
1636 /* Initialize NS/BSSGP side */
1637 f_init_bssgp();
1638 /* Initialize GPRS MS side */
1639 f_init_gprs_ms();
1640 ms := g_ms[0]; /* We only use first MS in this test */
1641
1642 /* Initialize the PCU interface abstraction */
1643 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1644 /* Set timer to 1 sec (default 5) to speedup test: */
1645 info_ind.t3191 := 1;
1646 f_init_raw(testcasename(), info_ind);
1647
1648 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1649
1650 /* Establish BSSGP connection to the PCU */
1651 f_bssgp_establish();
1652 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1653
1654 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1655 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1656 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1657
1658 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1659 f_sleep(X2002);
1660
1661 /* Send enough DL data to at least be able to DL ACK once (excl the
1662 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1663 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1664 while (true) {
1665 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1666
1667 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1668 log("Received FINAL_ACK");
1669 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1670 break;
1671 }
1672
1673 /* Keep Ack/Nack description updated (except for last BSN) */
1674 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1675
1676 if (f_dl_block_rrbp_valid(dl_block)) {
1677 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1678 f_dl_block_ack_fn(dl_block, dl_fn));
1679 }
1680 }
1681
1682 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1683 to time out. We simply sleep instead of requesting blocks because
1684 otherwise retransmissions would keep restarting the timer. */
1685 f_sleep(int2float(info_ind.t3191));
1686
1687 /* The TBF should be freed now, so new data should trigger an Assignment: */
1688 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1689 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1690
1691 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1692 f_sleep(X2002);
1693 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1694 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1695 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1696 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1697 f_dl_block_ack_fn(dl_block, dl_fn));
1698
1699 f_shutdown(__BFILE__, __LINE__, final := true);
1700}
1701
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001702/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1703 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1704 * T3193) after DL TBF release */
1705testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001706 var RlcmacDlBlock dl_block;
1707 var octetstring data := f_rnd_octstring(10);
1708 var boolean ok;
1709 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001710 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001711 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001712 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1713
1714 /* Initialize NS/BSSGP side */
1715 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001716 /* Initialize GPRS MS side */
1717 f_init_gprs_ms();
1718 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001719
1720 /* Initialize the PCU interface abstraction */
1721 f_init_raw(testcasename());
1722
1723 /* Establish BSSGP connection to the PCU */
1724 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001725 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001726
1727 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001728 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1729 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001730
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001731 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1732 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001733 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001734
1735 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001736 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));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001739
1740 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001741 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001742 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001743 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001744 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001745
1746 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001747
1748 /* 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 +07001749 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001750 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1751 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1752 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001753
1754 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001755}
1756
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001757/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1758 freed and no longer available. Trigger it by sending DL blocks and never DL
1759 ACKing the data (which are requested through RRBP) */
1760testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1761 var PCUIF_info_ind info_ind;
1762 var RlcmacDlBlock dl_block;
1763 var octetstring data1 := f_rnd_octstring(1000);
1764 var octetstring data2 := f_rnd_octstring(10);
1765 var uint32_t dl_fn;
1766 var template (value) TsTrxBtsNum nr;
1767 var BTS_PDTCH_Block data_msg;
1768 var GprsMS ms;
1769 const integer N3105_MAX := 2;
1770 var integer N3105 := 0;
1771 timer T_3195 := 1.0;
1772 var integer num_poll_recv := 0;
1773
1774 /* Initialize NS/BSSGP side */
1775 f_init_bssgp();
1776 /* Initialize GPRS MS side */
1777 f_init_gprs_ms();
1778 ms := g_ms[0]; /* We only use first MS in this test */
1779
1780 /* Initialize the PCU interface abstraction */
1781 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1782 /* Speedup test: */
1783 info_ind.n3105 := N3105_MAX;
1784 info_ind.t3195 := 1;
1785 f_init_raw(testcasename(), info_ind);
1786
1787 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1788 * MS and retransmitted after the TBF is released and later on created
1789 * (because the MS is reused) */
1790 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1791
1792 /* Establish BSSGP connection to the PCU */
1793 f_bssgp_establish();
1794 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1795
1796 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1797 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1798 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1799
1800 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1801 f_sleep(X2002);
1802
1803 /* Now we go on receiving DL data and not answering RRBP: */
1804 nr := ts_TsTrxBtsNum;
1805 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1806 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1807 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1808 block_nr := nr.blk_nr));
1809 alt {
1810 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1811 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1812 tr_RLCMAC_DATA)) -> value data_msg {
1813 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1814 if (num_poll_recv == 0) {
1815 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1816 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1817 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1818 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1819 } else {
1820 log("Ignoring RRBP ", num_poll_recv);
1821 N3105 := N3105 + 1;
1822 }
1823 num_poll_recv := num_poll_recv + 1;
1824 }
1825
1826 nr := ts_TsTrxBtsNum;
1827 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1828 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1829 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1830 block_nr := nr.blk_nr));
1831 repeat;
1832 }
1833 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1834 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1835 */
1836 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1837 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1838 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1839 if (not T_3195.running) {
1840 T_3195.start;
1841 /* We even send some new data, nothing should be sent to MS */
1842 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1843 }
1844 nr := ts_TsTrxBtsNum;
1845 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1846 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1847 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1848 block_nr := nr.blk_nr));
1849 repeat;
1850 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001851 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001852 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001853 /* Done in alt, wait for pending RTS initiated previously in
1854 * above case before continuing (expect /* Dummy block): */
1855 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1856 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1857 tr_RLCMAC_DUMMY_CTRL));
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001858 }
1859 [] BTS.receive {
1860 setverdict(fail, "Unexpected BTS message");
1861 f_shutdown(__BFILE__, __LINE__);
1862 }
1863 }
1864
1865 /* after T_3195 timeout, TBF is released */
1866 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1867 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1868
1869 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1870 f_sleep(X2002);
1871 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1872
1873 /* ACK the DL block */
1874 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1875 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1876 f_dl_block_ack_fn(dl_block, dl_fn));
1877
1878 f_shutdown(__BFILE__, __LINE__, final := true);
1879}
1880
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001881/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1882testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001883 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001884 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001885 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001886 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001887
1888 /* Initialize NS/BSSGP side */
1889 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001890 /* Initialize GPRS MS side */
1891 f_init_gprs_ms();
1892 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001893
1894 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001895 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001896
1897 /* Establish BSSGP connection to the PCU */
1898 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001899 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001900
1901 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001902 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001903
1904 /* Send one UL block (with TLLI since we are in One-Phase Access
1905 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001906 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001907 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
1908 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001909 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1910 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001911 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001912
1913 /* Send enough blocks to test whole procedure: Until Nth block
1914 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1915 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001916 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001917 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1918 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001919 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001920
1921 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001922 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 +07001923
1924 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001925}
1926
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001927/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1928testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1929 var RlcmacDlBlock dl_block;
1930 var uint32_t dl_fn, sched_fn;
1931 var octetstring payload;
1932 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001933 var template (value) LlcBlockHdr blk_hdr;
1934 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001935 var integer blk_len;
1936 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001937 var GprsMS ms;
1938
1939 /* Initialize NS/BSSGP side */
1940 f_init_bssgp();
1941 /* Initialize GPRS MS side */
1942 f_init_gprs_ms();
1943 ms := g_ms[0]; /* We only use first MS in this test */
1944
1945 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001946 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001947
1948 /* Establish BSSGP connection to the PCU */
1949 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001950 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001951
1952 /* Establish an Uplink TBF */
1953 f_ms_establish_ul_tbf(ms);
1954
1955 /* Send one UL block (with TLLI since we are in One-Phase Access
1956 contention resoultion) and make sure it is ACKED fine. */
1957 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001958 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1959 more := false, e := true);
1960 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001961 /* 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 +01001962 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1963 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001964 cv := 15,
1965 bsn := ms.ul_tbf.bsn,
1966 blocks := blocks,
1967 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001968 f_ultbf_inc_bsn(ms.ul_tbf);
1969 f_ms_tx_ul_block(ms, ul_data);
1970
1971 /* ACK and check it was received fine */
1972 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1973 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1974 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1975 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001976 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 +02001977
1978 /* Test sending LLC PDUS of incrementing size */
1979 var integer max_size := 49;
1980 for (var integer i := 1; i <= max_size; i := i + 1) {
1981 var integer cv;
1982 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1983 log("Sending DATA.ind with LLC payload size ", i);
1984 if (i < max_size - g_bs_cv_max) {
1985 cv := 15;
1986 } else {
1987 cv := max_size - i;
1988 }
1989
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001990 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1991 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001992 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001993 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1994 more := false, e := true);
1995 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001996 /* 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 +01001997 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1998 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001999 cv := cv,
2000 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002001 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002002 f_ultbf_inc_bsn(ms.ul_tbf);
2003 f_ms_tx_ul_block(ms, ul_data);
2004
2005 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002006 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 +02002007
2008 /* we will receive UL ACK/NACK from time to time, handle it. */
2009 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2010 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2011 continue;
2012 }
2013 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2014 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2015 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2016 f_shutdown(__BFILE__, __LINE__);
2017 }
2018
2019 log("Rx Packet Uplink ACK / NACK");
2020 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2021 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2022 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2023 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002024
2025 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002026}
2027
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002028function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2029 var octetstring payload;
2030 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002031 var template (value) LlcBlockHdr blk_hdr;
2032 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002033 var integer block_len, max_valid_data_len;
2034 timer T;
2035
2036 block_len := f_rlcmac_cs_mcs2block_len(cs);
2037 /* We need to send with TLLI since we are in One-Phase Access Contenion
2038 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2039 * indicator, -1 for spare bits octet at the end */
2040 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2041 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 +07002042 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2043 more := false, e := true);
2044 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002045 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2046 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002047 cv := cv,
2048 bsn := ms.ul_tbf.bsn,
2049 blocks := blocks,
2050 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002051 f_ultbf_inc_bsn(ms.ul_tbf);
2052 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2053
2054 T.start(0.5);
2055 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002056 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002057 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2058 f_shutdown(__BFILE__, __LINE__);
2059 }
2060 [] T.timeout {
2061 setverdict(pass);
2062 }
2063 }
2064}
2065/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2066 blocks intentionally contain last byte of data placed in last byte of RLC
2067 containing padding/spare bits, which is incorrect. Spare bits exist and are
2068 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2069 discounting padding in octet" */
2070testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2071 var GprsMS ms;
2072 var integer block_len, max_valid_data_len;
2073
2074 /* Initialize NS/BSSGP side */
2075 f_init_bssgp();
2076 /* Initialize GPRS MS side */
2077 f_init_gprs_ms();
2078 ms := g_ms[0]; /* We only use first MS in this test */
2079
2080 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002081 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002082
2083 /* Establish BSSGP connection to the PCU */
2084 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002085 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002086
2087 /* Establish an Uplink TBF */
2088 f_ms_establish_ul_tbf(ms);
2089
2090 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2091 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2092 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2093
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002094 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002095}
2096
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002097/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2098 * answered, so TBFs for uplink and later for downlink are created.
2099 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002100private 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 +02002101 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002102 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002103 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002104 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002105 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002106
2107 /* Initialize NS/BSSGP side */
2108 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002109 /* Initialize GPRS MS side */
2110 f_init_gprs_ms();
2111 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002112
2113 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002114 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002115
2116 /* Establish BSSGP connection to the PCU */
2117 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002118 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002119
2120 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002121 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002122
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002123 /* Send one UL block (with TLLI since we are in One-Phase Access
2124 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002125 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002126 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2127 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002129
2130 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002131 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002132
2133 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002134 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2135 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002136
2137 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2138 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002139 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002140
2141 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002142 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2143 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2144 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002145
2146 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002147}
2148
2149/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2150 * answered, so TBFs for uplink and later for downlink are created.
2151 */
2152testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002153 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002154 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002155}
2156
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002157/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2158 * answered, so TBFs for uplink and later for downlink are created.
2159 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002160private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2161 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002162 template (present) CodingScheme exp_ul_cs_mcs := ?,
2163 template (present) CodingScheme exp_dl_cs_mcs := ?)
2164runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002165 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002166 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002167 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002168 var uint32_t sched_fn;
2169 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002170 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002171 var GprsMS ms;
2172
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002173 /* Initialize NS/BSSGP side */
2174 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002175 /* Initialize GPRS MS side */
2176 f_init_gprs_ms();
2177 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002178
2179 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002180 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002181
2182 /* Establish BSSGP connection to the PCU */
2183 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002184 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002185
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002186 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2187 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 +02002188
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002189 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2190 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 +02002191 f_shutdown(__BFILE__, __LINE__);
2192 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002193
2194 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2195 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002196 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002197
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002198 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002199 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 +02002200
2201 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002202 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002203
2204 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002205 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002206 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2207 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002208 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002209 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002210 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002211
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002212 /* PCU acks the UL data after having received CV=0) */
2213 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2214
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002215 /* 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 +02002216 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 +02002217
2218 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002219 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2220 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 +02002221 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002222
2223 f_shutdown(__BFILE__, __LINE__, final := true);
2224}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002225
2226testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002227 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2228 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002229
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002230 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 +02002231}
2232
2233testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002234 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2235 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002236
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002237 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 +02002238}
2239
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002240testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2241 /* Configure PCU to force two phase access */
2242 g_force_two_phase_access := true;
2243
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002244 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002245 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002246
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002247 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 +02002248}
2249
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002250/* Test scenario where SGSN wants to send some data against MS and it is
2251 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2252 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002253private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2254 template (present) CodingScheme exp_cs_mcs := ?)
2255runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002256 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002257 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002258 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002259 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002260 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002261
2262 /* Initialize NS/BSSGP side */
2263 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002264 /* Initialize GPRS MS side */
2265 f_init_gprs_ms();
2266 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002267
2268 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002269 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002270
2271 /* Establish BSSGP connection to the PCU */
2272 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002273 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002274
2275 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002276 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2277 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002278
2279 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2280 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002281 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002282
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002283 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002284 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2285 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 +02002286 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002287
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002288 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002289 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002290
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002291 /* Send one UL block (with TLLI since we are in One-Phase Access
2292 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002293 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002294 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2295 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002296 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002297
2298 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002299 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002300
2301 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002302}
2303
2304testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002305 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002306 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2307}
2308
2309/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2310/* information about the MS */
2311testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002312 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002313 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002314}
2315
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002316/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2317 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2318 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2319 * be transferred).
2320 */
2321testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002322 var RlcmacDlBlock dl_block;
2323 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002324 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002325 var octetstring total_payload;
2326 var octetstring payload;
2327 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002328 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002329 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002330 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002331
2332 /* Initialize NS/BSSGP side */
2333 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002334 /* Initialize GPRS MS side */
2335 f_init_gprs_ms();
2336 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002337
2338 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002339 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002340
2341 /* Establish BSSGP connection to the PCU */
2342 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002343 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002344
2345 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002346 f_ms_establish_ul_tbf(ms);
2347 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002348
2349 /* Send one UL block (with TLLI since we are in One-Phase Access
2350 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002351 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 Pedrol4f7b8fd2020-05-18 18:28:17 +02002352 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002353
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002354 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2355 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002356 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002357 total_payload := payload;
2358
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002359 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2360
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002361 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002362 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002363 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002364 total_payload := total_payload & payload;
2365
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002366 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002367 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002368 total_payload := total_payload & payload;
2369
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002370 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002371 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 +02002372 total_payload := total_payload & lost_payload;
2373
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002374 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002375 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002376 total_payload := total_payload & payload;
2377
2378 /* 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 +02002379 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002380
2381 /* On CV=0, we'll receive a UL ACK asking about missing block */
2382 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2383 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002384 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2385 tfi := tfi,
2386 cv := 15,
2387 bsn := 3,
2388 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002389 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002390
2391 /* Now final ack is recieved */
2392 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2393 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002394 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002395
2396 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002397 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 +07002398
2399 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002400}
2401
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002402/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2403 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2404 * timeout occurs (specified by sent RRBP on DL block). */
2405testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002406 var RlcmacDlBlock dl_block;
2407 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002408 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002409 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002410
2411 /* Initialize NS/BSSGP side */
2412 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002413 /* Initialize GPRS MS side */
2414 f_init_gprs_ms();
2415 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002416
2417 /* Initialize the PCU interface abstraction */
2418 f_init_raw(testcasename());
2419
2420 /* Establish BSSGP connection to the PCU */
2421 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002422 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002423
2424 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002425 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2426 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002427
2428 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2429 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002430 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002431
2432 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2433 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2434 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002435 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002436
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002437 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2438 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002439 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002440
2441 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002442 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2443 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2444 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002445
2446 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002447}
2448
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002449/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2450testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2451 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2452 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002453 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002454 var RlcmacDlBlock dl_block;
2455 var uint32_t ack_fn;
2456 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002457 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002458 timer T := 5.0;
2459
2460 /* Initialize NS/BSSGP side */
2461 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002462 /* Initialize GPRS MS side */
2463 f_init_gprs_ms();
2464 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002465
2466 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002467 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002468
Daniel Willmann535aea62020-09-21 13:27:08 +02002469 f_statsd_reset();
2470
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002471 /* Establish BSSGP connection to the PCU */
2472 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002473 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002474
2475 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002476 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2477 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002478
2479 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2480 f_sleep(X2002);
2481
2482 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2483 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002484 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002485
2486 /* TDMA frame number on which we are supposed to send the ACK */
2487 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2488
2489 /* SGSN sends more blocks during the indicated RRBP */
2490 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2491 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002492 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002493
2494 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2495
2496 /* Make sure this block has the same TFI as was assigned
2497 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002498 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002499 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2500 dl_block.data.mac_hdr.hdr_ext.tfi);
2501 f_shutdown(__BFILE__, __LINE__);
2502 }
2503
2504 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002505 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002506
2507 /* Break if this is the end of RRBP */
2508 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002509 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002510 break;
2511 }
2512 }
2513
2514 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002515 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 +07002516
2517 /* Make sure that the next block (after the Ack) is dummy */
2518 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2519
Daniel Willmann535aea62020-09-21 13:27:08 +02002520 var StatsDExpects expect := {
2521 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2522 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2523 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2524 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2525 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002526 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002527 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2528 };
2529 f_statsd_expect(expect);
2530
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002531 f_shutdown(__BFILE__, __LINE__, final := true);
2532}
2533
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002534/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2535 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2536 * Check "3GPP TS 44.060" Annex B. */
2537testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2538 var RlcmacDlBlock dl_block;
2539 var octetstring dataA := f_rnd_octstring(20);
2540 var octetstring dataB := f_rnd_octstring(13);
2541 var octetstring dataC := f_rnd_octstring(3);
2542 var octetstring dataD := f_rnd_octstring(12);
2543 var uint32_t sched_fn;
2544 var GprsMS ms;
2545 var template (value) RlcmacUlBlock ul_data;
2546
2547 /* Initialize NS/BSSGP side */
2548 f_init_bssgp();
2549 /* Initialize GPRS MS side */
2550 f_init_gprs_ms();
2551 ms := g_ms[0]; /* We only use first MS in this test */
2552
2553 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002554 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002555
2556 /* Establish BSSGP connection to the PCU */
2557 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002558 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002559
2560 /* Establish an Uplink TBF */
2561 f_ms_establish_ul_tbf(ms);
2562
2563 /* Summary of what's transmitted:
2564 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2565 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2566 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2567 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2568 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2569 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2570 */
2571
2572 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002573 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2574 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002575 cv := 3,
2576 bsn := ms.ul_tbf.bsn,
2577 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2578 tlli := ms.tlli);
2579 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2580 * RLCMAC block being sent. */
2581 ul_data.data.mac_hdr.e := true;
2582 f_ultbf_inc_bsn(ms.ul_tbf);
2583 f_ms_tx_ul_block(ms, ul_data);
2584
2585 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002586 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2587 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002588 cv := 2,
2589 bsn := ms.ul_tbf.bsn,
2590 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2591 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2592 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2593 },
2594 tlli := ms.tlli);
2595 f_ultbf_inc_bsn(ms.ul_tbf);
2596 f_ms_tx_ul_block(ms, ul_data);
2597
2598 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002599 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 +02002600
2601 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002602 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2603 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002604 cv := 1,
2605 bsn := ms.ul_tbf.bsn,
2606 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2607 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2608 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2609 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2610 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2611 },
2612 tlli := ms.tlli);
2613 f_ultbf_inc_bsn(ms.ul_tbf);
2614 f_ms_tx_ul_block(ms, ul_data);
2615
2616 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002617 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2618 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 +02002619
2620 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002621 ul_data := t_RLCMAC_UL_DATA_TLLI(
2622 cs := CS_1,
2623 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002624 cv := 0,
2625 bsn := ms.ul_tbf.bsn,
2626 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2627 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2628 },
2629 tlli := ms.tlli);
2630 f_ultbf_inc_bsn(ms.ul_tbf);
2631 f_ms_tx_ul_block(ms, ul_data);
2632
2633 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002634 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 +02002635
2636 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2637 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2638 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2639
2640 f_shutdown(__BFILE__, __LINE__, final := true);
2641}
2642
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002643/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2644 * ACK/NACK is not answered */
2645testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2646 var RlcmacDlBlock dl_block;
2647 var octetstring data1 := f_rnd_octstring(200);
2648 var octetstring data2 := f_rnd_octstring(10);
2649 var uint32_t dl_fn;
2650 var GprsMS ms;
2651 var template (value) TsTrxBtsNum nr;
2652 var BTS_PDTCH_Block data_msg;
2653
2654 /* Initialize NS/BSSGP side */
2655 f_init_bssgp();
2656 /* Initialize GPRS MS side */
2657 f_init_gprs_ms();
2658 ms := g_ms[0]; /* We only use first MS in this test */
2659
2660 /* Initialize the PCU interface abstraction */
2661 f_init_raw(testcasename())
2662
2663 /* Establish BSSGP connection to the PCU */
2664 f_bssgp_establish();
2665 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2666
2667 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2668 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2669 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2670
2671 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2672 f_sleep(X2002);
2673
2674 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2675 while (true) {
2676 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2677
2678 /* Keep Ack/Nack description updated (except for last BSN) */
2679 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2680
2681 if (f_dl_block_rrbp_valid(dl_block)) {
2682 /* Don't transmit DL ACK here on purpose ignore it */
2683 break;
2684 }
2685 }
2686
2687 /* PCU starts whole process again */
2688 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2689
2690 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2691 f_sleep(X2002);
2692
2693 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2694 /* DL data), after that we receive only DUMMY blocks so we are done */
2695 var boolean data_received := false;
2696 nr := ts_TsTrxBtsNum;
2697 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2698 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2699 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2700 block_nr := nr.blk_nr));
2701 alt {
2702 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2703 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2704 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2705 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2706 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2707 tr_RLCMAC_DATA)) -> value data_msg {
2708 data_received := true;
2709 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2710 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2711 log("Received FINAL_ACK");
2712 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2713 }
2714 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2715 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2716 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2717 }
2718 nr := ts_TsTrxBtsNum;
2719 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2720 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2721 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2722 block_nr := nr.blk_nr));
2723 repeat;
2724 }
2725 [] BTS.receive {
2726 setverdict(fail, "Unexpected BTS message");
2727 f_shutdown(__BFILE__, __LINE__);
2728 }
2729 }
2730
2731 f_shutdown(__BFILE__, __LINE__, final := true);
2732}
2733
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002734/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2735testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002736 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002737 var octetstring data := f_rnd_octstring(10);
2738 var PacketDlAssign dl_tbf_ass;
2739 var RlcmacDlBlock dl_block;
2740 var uint32_t poll_fn;
2741 var uint32_t sched_fn;
2742 var GprsMS ms;
2743 timer T := 5.0;
2744
2745 /* Initialize NS/BSSGP side */
2746 f_init_bssgp();
2747 /* Initialize GPRS MS side */
2748 f_init_gprs_ms();
2749 ms := g_ms[0]; /* We only use first MS in this test */
2750
2751 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002752 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2753 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002754
2755 /* Initialize the PCU interface abstraction */
2756 f_init_raw(testcasename(), info_ind);
2757
2758 /* Establish BSSGP connection to the PCU */
2759 f_bssgp_establish();
2760 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2761
2762 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2763 through PDCH (no multiblock assignment possible through PCH) */
2764 f_ms_establish_ul_tbf(ms);
2765
2766 /* Send one UL block (with TLLI since we are in One-Phase Access
2767 contention resoultion) and make sure it is ACKED fine */
2768 f_ms_tx_ul_data_block(ms, data, with_tlli := true, nr := f_ms_tx_TsTrxBtsNum(ms));
2769 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2770 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2771
2772 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2773 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2774 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2775 gprsextendeddynalloccap := '0'B
2776 };
2777 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2778 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2779 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2780 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2781 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2782 f_shutdown(__BFILE__, __LINE__);
2783 }
2784 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2785
2786 f_shutdown(__BFILE__, __LINE__, final := true);
2787}
2788
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002789testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002790 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002791 var RlcmacDlBlock dl_block;
2792 var octetstring data := f_rnd_octstring(10);
2793 var PollFnCtx pollctx;
2794 var uint32_t sched_fn;
2795 var GprsMS ms;
2796
2797 var MultislotCap_GPRS mscap_gprs := {
2798 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2799 gprsextendeddynalloccap := '0'B
2800 };
2801 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2802
2803
2804 /* Initialize NS/BSSGP side */
2805 f_init_bssgp();
2806 /* Initialize GPRS MS side */
2807 f_init_gprs_ms();
2808 ms := g_ms[0]; /* We only use first MS in this test */
2809
2810 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002811 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2812 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002813
2814 /* Initialize the PCU interface abstraction */
2815 f_init_raw(testcasename(), info_ind);
2816
2817 /* Establish BSSGP connection to the PCU */
2818 f_bssgp_establish();
2819 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2820
2821 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2822 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2823
2824 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2825 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2826
2827 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2828 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2829 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2830 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2831 f_shutdown(__BFILE__, __LINE__);
2832 }
2833 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2834
2835 f_shutdown(__BFILE__, __LINE__, final := true);
2836}
2837
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002838testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2839 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2840 var RlcmacDlBlock dl_block;
2841 var octetstring data := f_rnd_octstring(10);
2842 var PollFnCtx pollctx;
2843 var uint32_t sched_fn;
2844 var GprsMS ms;
2845
2846 var MultislotCap_GPRS mscap_gprs := {
2847 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2848 gprsextendeddynalloccap := '0'B
2849 };
2850 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2851
2852
2853 /* Initialize NS/BSSGP side */
2854 f_init_bssgp();
2855 /* Initialize GPRS MS side */
2856 f_init_gprs_ms();
2857 ms := g_ms[0]; /* We only use first MS in this test */
2858
2859 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002860 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2861 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002862
2863 /* Initialize the PCU interface abstraction */
2864 f_init_raw(testcasename(), info_ind);
2865
2866 /* Establish BSSGP connection to the PCU */
2867 f_bssgp_establish();
2868 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2869
2870 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2871 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2872
2873 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2874 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2875 f_shutdown(__BFILE__, __LINE__);
2876 }
2877
2878 f_shutdown(__BFILE__, __LINE__, final := true);
2879}
2880
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002881/* Test scenario where MS wants to request a new TBF once the current one is
2882 * ending, by means of sending a Packet Resource Request on ul slot provided by
2883 * last Pkt Ul ACK's RRBP.
2884 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2885testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002886 var RlcmacDlBlock dl_block;
2887 var octetstring data := f_rnd_octstring(10);
2888 var uint32_t sched_fn;
2889 var uint32_t dl_fn;
2890 var template RlcmacDlBlock acknack_tmpl;
2891 var GprsMS ms;
2892
2893 /* Initialize NS/BSSGP side */
2894 f_init_bssgp();
2895 /* Initialize GPRS MS side */
2896 f_init_gprs_ms();
2897 ms := g_ms[0]; /* We only use first MS in this test */
2898
2899 /* Initialize the PCU interface abstraction */
2900 f_init_raw(testcasename());
2901
2902 /* Establish BSSGP connection to the PCU */
2903 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002904 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002905
2906 /* Establish an Uplink TBF */
2907 f_ms_establish_ul_tbf(ms);
2908
2909 /* Send one UL block (with TLLI since we are in One-Phase Access
2910 contention resoultion) and make sure it is ACKED fine */
2911 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2912
2913 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002914 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002915
2916 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2917 tr_UlAckNackGprs(ms.tlli,
2918 tr_AckNackDescription(final_ack := '1'B),
2919 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2920 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2921
2922 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2923
2924 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002925 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 +07002926 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002927 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2928 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2929
2930 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2931 and make sure it is ACKED fine */
2932 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2933
2934 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002935 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002936
2937 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2938 /* ACK the ACK */
2939 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2940
2941 f_shutdown(__BFILE__, __LINE__, final := true);
2942}
2943
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002944/* Test CS paging over the BTS<->PCU socket.
2945 * 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.
2946 * Paging should be send on the PACCH.
2947 *
2948 * 1. Send a Paging Request over PCU socket.
2949 * 2. Send a Ready-To-Send message over PCU socket
2950 * 3. Expect a Paging Frame
2951 */
2952testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002953 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002954 var MobileIdentityLV mi;
2955 var octetstring mi_enc_lv;
2956 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002957 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002958
2959 /* Initialize NS/BSSGP side */
2960 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002961 /* Initialize GPRS MS side */
2962 f_init_gprs_ms();
2963 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002964
2965 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002966 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002967
2968 /* Establish BSSGP connection to the PCU */
2969 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002971
2972 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002973 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002974
2975 /* build mobile Identity */
2976 mi := valueof(ts_MI_IMSI_LV(imsi));
2977 mi_enc_lv := enc_MobileIdentityLV(mi);
2978 /* Send paging request */
2979 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2980 sapi :=PCU_IF_SAPI_PDTCH));
2981
2982 /* Receive it on BTS side towards MS */
2983 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2984
2985 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002986 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2987 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2988 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2989 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002990
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002991 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002992}
2993
2994/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2995 */
2996private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2997runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002998 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002999 var hexstring imsi := f_gen_imsi(42);
3000 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003001 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003002
3003 /* Initialize NS/BSSGP side */
3004 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003005 /* Initialize GPRS MS side */
3006 f_init_gprs_ms();
3007 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003008
3009 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003010 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003011
3012 /* Establish BSSGP connection to the PCU */
3013 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003014 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003015
3016 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003017 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003018
3019 /* Send paging request with or without TMSI */
3020 if (use_ptmsi) {
3021 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3022 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3023 } else {
3024 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3025 }
3026
3027 /* Receive it on BTS side towards MS */
3028 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3029
3030 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003031 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003032 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003033 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3034 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3035 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003036 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003037 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3038 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3039 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003040 }
3041
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003042 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003043}
3044
3045testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3046 f_tc_paging_cs_from_sgsn(0, true);
3047}
3048
3049testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3050 f_tc_paging_cs_from_sgsn(0);
3051}
3052
3053testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003054 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003055}
3056
3057/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3058 */
3059private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3060runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003061 var integer imsi_suff_tx := 423;
3062 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003063 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003064
3065 /* Initialize NS/BSSGP side */
3066 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003067 /* Initialize GPRS MS side */
3068 f_init_gprs_ms();
3069 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003070
3071 /* Initialize the PCU interface abstraction */
3072 f_init_raw(testcasename());
3073
3074 /* Establish BSSGP connection to the PCU */
3075 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003076 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003077
3078 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3079 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3080 if (use_ptmsi) {
3081 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3082 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3083 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3084 } else {
3085 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3086 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3087 }
3088
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003089 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003090}
3091
3092testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3093 f_tc_paging_ps_from_sgsn(0, true);
3094}
3095
3096testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3097 f_tc_paging_ps_from_sgsn(0);
3098}
3099
3100testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003101 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003102}
3103
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003104/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3105testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3106 var RlcmacDlBlock dl_block;
3107 var octetstring data := f_rnd_octstring(10);
3108 var uint32_t sched_fn;
3109 var uint32_t dl_fn;
3110 var GprsMS ms;
3111
3112 /* Initialize NS/BSSGP side */
3113 f_init_bssgp();
3114 /* Initialize GPRS MS side */
3115 f_init_gprs_ms();
3116 ms := g_ms[0]; /* We only use first MS in this test */
3117
3118 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003119 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003120
Daniel Willmann535aea62020-09-21 13:27:08 +02003121 f_statsd_reset();
3122
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003123 /* Establish BSSGP connection to the PCU */
3124 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003125 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003126
3127 /* Establish an Uplink TBF */
3128 f_ms_establish_ul_tbf(ms);
3129
3130 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3131 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3132 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3133 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3134 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3135
3136 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003137 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003138
3139 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3140 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3141 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3142
3143 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3144 f_sleep(X2002);
3145 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3146
3147 /* ACK the DL block */
3148 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3149 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3150 f_dl_block_ack_fn(dl_block, dl_fn));
3151
Daniel Willmann535aea62020-09-21 13:27:08 +02003152 var StatsDExpects expect := {
3153 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3154 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3155 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3156 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003157 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003158 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003159 };
3160 f_statsd_expect(expect);
3161
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003162 f_shutdown(__BFILE__, __LINE__, final := true);
3163}
3164
3165/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3166testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3167 var RlcmacDlBlock dl_block;
3168 var octetstring data := f_rnd_octstring(10);
3169 var uint32_t sched_fn;
3170 var uint32_t dl_fn;
3171 var GprsMS ms;
3172
3173 /* Initialize NS/BSSGP side */
3174 f_init_bssgp();
3175 /* Initialize GPRS MS side */
3176 f_init_gprs_ms();
3177 ms := g_ms[0]; /* We only use first MS in this test */
3178
3179 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003180 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003181
3182 /* Establish BSSGP connection to the PCU */
3183 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003184 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003185
3186 /* Establish an Uplink TBF */
3187 f_ms_establish_ul_tbf(ms);
3188
3189 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3190 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3191 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3192 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3193 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3194
3195 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003196 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003197
3198 /* Now SGSN sends some DL data with an invalid IMSI */
3199 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3200
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003201 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003202
3203 /* TODO: make sure no data is sent over PCU -> MS */
3204
3205 f_shutdown(__BFILE__, __LINE__, final := true);
3206}
3207
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003208private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3209 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3210 var octetstring data := f_rnd_octstring(6);
3211 var RlcmacDlBlock dl_block;
3212 var GprsMS ms;
3213 var uint32_t fn;
3214
3215 /* Initialize NS/BSSGP side */
3216 f_init_bssgp();
3217 /* Initialize GPRS MS side */
3218 f_init_gprs_ms();
3219 ms := g_ms[0]; /* We only use first MS in this test */
3220
3221 /* Initialize the PCU interface abstraction */
3222 f_init_raw(testcasename());
3223
3224 /* Establish BSSGP connection to the PCU */
3225 f_bssgp_establish();
3226 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3227
3228 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3229 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3230 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3231
3232 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3233 f_sleep(X2002);
3234
3235 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3236 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3237
3238 if (ischosen(dl_block.data_egprs)) {
3239 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3240 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3241 f_shutdown(__BFILE__, __LINE__);
3242 }
3243 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3244 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3245 f_shutdown(__BFILE__, __LINE__);
3246 }
3247 if (not match(dl_block.data_egprs.blocks[1].payload,
3248 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3249 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3250 f_shutdown(__BFILE__, __LINE__);
3251 }
3252 } else if (lengthof(dl_block.data.blocks) > 1) {
3253 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3254 f_shutdown(__BFILE__, __LINE__);
3255 }
3256
3257 f_shutdown(__BFILE__, __LINE__, final := true);
3258}
3259
3260/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3261 * containing llc data. See OS#4849 */
3262testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3263 f_tc_dl_data_no_llc_ui_dummy(omit);
3264}
3265
3266/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3267 * containing llc data. See OS#4849 */
3268testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003269 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003270}
3271
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003272private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003273 template GsmRrMessage t_imm_ass := ?,
3274 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003275runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003276 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003277 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003278
3279 ra11 := enc_EGPRSPktChRequest2uint(req);
3280 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3281
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003282 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003283 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003284 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003285 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003286 }
3287
3288 setverdict(pass);
3289}
3290
3291testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3292 var template GsmRrMessage imm_ass;
3293 var template IaRestOctets rest;
3294 var template EgprsUlAss ul_ass;
3295
3296 /* Initialize the PCU interface abstraction */
3297 f_init_raw(testcasename());
3298
3299 var EGPRSPktChRequest req := {
3300 /* NOTE: other fields are set in the loop */
3301 signalling := { tag := '110011'B }
3302 };
3303
3304 for (var integer i := 0; i < 6; i := i + 1) {
3305 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3306 req.signalling.random_bits := ext_ra;
3307
3308 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3309 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3310 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3311 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3312
3313 f_TC_egprs_pkt_chan_req(req, imm_ass);
3314 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003315
3316 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003317}
3318
3319testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3320 var template GsmRrMessage imm_ass;
3321 var template IaRestOctets rest;
3322 var template EgprsUlAss ul_ass;
3323
3324 /* Initialize the PCU interface abstraction */
3325 f_init_raw(testcasename());
3326
3327 var EGPRSPktChRequest req := {
3328 /* NOTE: other fields are set in the loop */
3329 one_phase := { tag := '0'B }
3330 };
3331
3332 for (var integer i := 0; i < 6; i := i + 1) {
3333 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3334 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3335 var BIT2 priority := substr(ext_ra, 0, 2);
3336 var BIT3 rand := substr(ext_ra, 2, 3);
3337
3338 req.one_phase.multislot_class := mslot_class;
3339 req.one_phase.priority := priority;
3340 req.one_phase.random_bits := rand;
3341
3342 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3343 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3344 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3345 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3346
3347 f_TC_egprs_pkt_chan_req(req, imm_ass);
3348 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003349
3350 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003351}
3352
3353testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3354 var template GsmRrMessage imm_ass;
3355 var template IaRestOctets rest;
3356 var template EgprsUlAss ul_ass;
3357
3358 /* Initialize the PCU interface abstraction */
3359 f_init_raw(testcasename());
3360
3361 var EGPRSPktChRequest req := {
3362 /* NOTE: other fields are set in the loop */
3363 two_phase := { tag := '110000'B }
3364 };
3365
3366 for (var integer i := 0; i < 6; i := i + 1) {
3367 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3368 var BIT2 priority := substr(ext_ra, 0, 2);
3369 var BIT3 rand := substr(ext_ra, 2, 3);
3370
3371 req.two_phase.priority := priority;
3372 req.two_phase.random_bits := rand;
3373
3374 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3375 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3376 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3377 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3378
3379 f_TC_egprs_pkt_chan_req(req, imm_ass);
3380 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003381
3382 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003383}
3384
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003385private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3386 template IARRestOctets rest := ?,
3387 PCUIF_BurstType bt := BURST_TYPE_1)
3388runs on RAW_PCU_Test_CT {
3389 var template ReqRefWaitInd tr_ref;
3390 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003391
3392 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3393 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3394 ra := bit2int(ra11), is_11bit := 1,
3395 burst_type := bt, fn := fn,
3396 arfcn := 871));
3397
3398 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003399 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003400
3401 /* Just to have a short-name reference to the actual message */
3402 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3403
3404 /* Make sure that Request Reference list contains at least one entry
3405 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3406 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3407 if (not match(iar.payload, { *, tr_ref, * })) {
3408 setverdict(fail, "Request Reference list does not match");
3409 f_shutdown(__BFILE__, __LINE__);
3410 }
3411
3412 /* Match Feature Indicator (must indicate PS domain) */
3413 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3414 setverdict(fail, "Feature Indicator does not match");
3415 f_shutdown(__BFILE__, __LINE__);
3416 }
3417
3418 /* Match IAR Rest Octets */
3419 if (not match(iar.rest_octets, rest)) {
3420 setverdict(fail, "IAR Rest Octets does not match: ",
3421 iar.rest_octets, " vs expected ", rest);
3422 f_shutdown(__BFILE__, __LINE__);
3423 }
3424
3425 setverdict(pass);
3426}
3427
3428/* Verify the contents of RR Immediate Assignment Reject message and its
3429 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3430testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3431 var template IARRestOctets rest;
3432 var BIT5 ext_ra;
3433
3434 /* Initialize the PCU interface abstraction */
3435 f_init_raw(testcasename());
3436
3437 for (var integer i := 0; i < 6; i := i + 1) {
3438 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3439 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3440
3441 /* Intentionally incorrect message (see table 11.2.5a.2) */
3442 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3443 }
3444
3445 f_shutdown(__BFILE__, __LINE__, final := true);
3446}
3447
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003448/* At the moment, the IUT does not support any emergency services. Make sure
3449 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3450testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3451 var template IARRestOctets rest;
3452 var BIT5 ext_ra;
3453 var BIT11 ra11;
3454
3455 /* Initialize the PCU interface abstraction */
3456 f_init_raw(testcasename());
3457
3458 var EGPRSPktChRequest req := {
3459 /* NOTE: other fields are set in the loop */
3460 emergency := { tag := '110111'B }
3461 };
3462
3463 for (var integer i := 0; i < 6; i := i + 1) {
3464 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3465 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3466
3467 req.emergency.random_bits := ext_ra;
3468 ra11 := enc_EGPRSPktChRequest2bits(req);
3469
3470 /* Intentionally incorrect message (see table 11.2.5a.2) */
3471 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3472 }
3473
3474 f_shutdown(__BFILE__, __LINE__, final := true);
3475}
3476
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003477/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3478testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003479 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003480 var template IARRestOctets rest;
3481 var BIT11 ra11;
3482
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003483 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003484
3485 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003486 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3487 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003488
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003489 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003490 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003491
3492 var EGPRSPktChRequest req := {
3493 one_phase := {
3494 tag := '0'B,
3495 multislot_class := '10101'B,
3496 priority := '01'B,
3497 random_bits := '101'B
3498 }
3499 };
3500
3501 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3502 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3503 for (var integer i := 0; i < 7; i := i + 1) {
3504 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3505 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3506 }
3507
3508 ra11 := enc_EGPRSPktChRequest2bits(req);
3509 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3510
3511 /* At this point, the IUT should run out of free USFs */
3512 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3513
3514 f_shutdown(__BFILE__, __LINE__, final := true);
3515}
3516
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003517/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003518private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003519return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003520 /* Pick a random MA length in range 2 .. max_ma_len */
3521 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3522
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003523 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3524 hsn := f_rnd_int(63),
3525 maio := f_rnd_int(63),
3526 ma := f_rnd_bitstring(ma_len));
3527}
3528
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003529private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3530 in GsmRrMessage rr_msg)
3531{
3532 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003533 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003534
3535 var template PacketChannelDescription tr_pkt_chan_desc := {
3536 channel_Type_spare := ?,
3537 tn := ?,
3538 tsc := ts.tsc,
3539 presence := '1'B,
3540 zero := omit,
3541 one := {
3542 maio := ts.maio,
3543 hsn := ts.hsn
3544 }
3545 };
3546
3547 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3548 setverdict(fail, "Packet Channel Description does not match: ",
3549 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3550 }
3551
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003552 /* Mobile Allocation is expected to be octet-aligned */
3553 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3554 var template MobileAllocationLV tr_ma := {
3555 len := ma_oct_len, /* in bytes */
3556 ma := substr(ts.ma, 0, ma_oct_len * 8)
3557 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003558
3559 if (not match(ia.mobile_allocation, tr_ma)) {
3560 setverdict(fail, "Mobile Allocation does not match: ",
3561 ia.mobile_allocation, " vs ", tr_ma);
3562 }
3563
3564 setverdict(pass);
3565}
3566
3567/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3568testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003569 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003570 var GprsMS ms := valueof(t_GprsMS_def);
3571
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003572 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003573 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003574
3575 /* Initialize the PCU interface abstraction */
3576 f_init_raw(testcasename(), info_ind);
3577
3578 /* EGPRS Packet Channel Request (cause=Signalling) */
3579 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3580
3581 /* Establish an Uplink EGPRS TBF */
3582 f_ms_establish_ul_tbf(ms);
3583
3584 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3585 f_shutdown(__BFILE__, __LINE__, final := true);
3586}
3587
3588/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3589testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003590 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003591 var GprsMS ms := valueof(t_GprsMS_def);
3592
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003593 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003594 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003595
3596 /* Initialize the PCU interface abstraction */
3597 f_init_raw(testcasename(), info_ind);
3598
3599 /* Establish an Uplink TBF */
3600 f_ms_establish_ul_tbf(ms);
3601
3602 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3603 f_shutdown(__BFILE__, __LINE__, final := true);
3604}
3605
3606/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3607testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003608 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003609 var GprsMS ms := valueof(t_GprsMS_def);
3610
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003611 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003612 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003613
3614 /* Initialize NS/BSSGP side */
3615 f_init_bssgp();
3616
3617 /* Initialize the PCU interface abstraction */
3618 f_init_raw(testcasename(), info_ind);
3619
3620 /* Establish BSSGP connection to the PCU */
3621 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003622 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003623
3624 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3625 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3626 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3627
3628 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3629 f_shutdown(__BFILE__, __LINE__, final := true);
3630}
3631
3632private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3633 in FrequencyParameters fp)
3634{
3635 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003636 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003637
3638 /* Table 12.8.1: Frequency Parameters information elements */
3639 var template FrequencyParameters tr_fp := {
3640 tsc := ts.tsc,
3641 presence := '10'B, /* Direct encoding 1 */
3642 arfcn := omit,
3643 indirect := omit,
3644 direct1 := {
3645 maio := ts.maio,
3646 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3647 mobile_allocation := {
3648 hsn := ts.hsn,
3649 rfl_number_list_present := '0'B,
3650 rfl_number_list := omit,
3651 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003652 ma_length := ts.ma_bit_len,
3653 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003654 }
3655 },
3656 direct2 := omit
3657 };
3658
3659 if (not match(fp, tr_fp)) {
3660 setverdict(fail, "Frequency Parameters IE does not match: ",
3661 fp, " vs ", tr_fp);
3662 }
3663
3664 setverdict(pass);
3665}
3666
3667/* Make sure that Packet Uplink Assignment contains hopping parameters */
3668testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003669 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003670 var GprsMS ms := valueof(t_GprsMS_def);
3671 var uint32_t poll_fn;
3672
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003673 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003674 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003675
3676 /* Initialize the PCU interface abstraction */
3677 f_init_raw(testcasename(), info_ind);
3678
3679 /* Establish an Uplink TBF */
3680 f_ms_establish_ul_tbf(ms);
3681
3682 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
3683 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)));
3684
3685 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003686 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3687 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003688
3689 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3690 var template (omit) FrequencyParameters fp;
3691 if (ua.is_egprs == '1'B) {
3692 fp := ua.egprs.freq_par;
3693 } else {
3694 fp := ua.gprs.freq_par;
3695 }
3696
3697 /* This is an optional IE, so it's worth to check its presence */
3698 if (istemplatekind(fp, "omit")) {
3699 setverdict(fail, "Frequency Parameters IE is not present");
3700 f_shutdown(__BFILE__, __LINE__);
3701 }
3702
3703 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3704 f_shutdown(__BFILE__, __LINE__, final := true);
3705}
3706
3707/* Make sure that Packet Downlink Assignment contains hopping parameters */
3708testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003709 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003710 var octetstring data := f_rnd_octstring(10);
3711 var GprsMS ms := valueof(t_GprsMS_def);
3712 var RlcmacDlBlock dl_block;
3713 var uint32_t poll_fn;
3714
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003715 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003716 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003717
3718 /* Initialize NS/BSSGP side */
3719 f_init_bssgp();
3720
3721 /* Initialize the PCU interface abstraction */
3722 f_init_raw(testcasename(), info_ind);
3723
3724 /* Establish BSSGP connection to the PCU */
3725 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003726 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003727
3728 /* Establish an Uplink TBF */
3729 f_ms_establish_ul_tbf(ms);
3730
3731 /* Send an Uplink block, so this TBF becomes "active" */
3732 f_ms_tx_ul_data_block(ms, data, with_tlli := true);
3733
3734 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3735 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3736 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3737
3738 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3739 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3740
3741 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003742 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3743 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003744
3745 /* This is an optional IE, so it's worth to check its presence */
3746 if (not ispresent(da.freq_par)) {
3747 setverdict(fail, "Frequency Parameters IE is not present");
3748 f_shutdown(__BFILE__, __LINE__);
3749 }
3750
3751 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3752 f_shutdown(__BFILE__, __LINE__, final := true);
3753}
3754
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003755/* Check if the IUT handles subsequent INFO.ind messages */
3756testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003757 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003758 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003759
3760 /* Initialize the PCU interface abstraction */
3761 f_init_raw(testcasename(), info_ind);
3762
3763 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3764 for (var integer i := 0; i < 16; i := i + 1) {
3765 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003766 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003767 }
3768
3769 f_shutdown(__BFILE__, __LINE__, final := true);
3770}
3771
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003772/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3773testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3774 var PCUIF_info_ind info_ind;
3775 var integer i;
3776 const integer num_ms := 8;
3777
3778 /* Initialize NS/BSSGP side */
3779 f_init_bssgp();
3780 /* Initialize GPRS MS side */
3781 f_init_gprs_ms(num_ms);
3782
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003783 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003784 /* Only the 3 first TRX are enabled. The enabled ones all have same
3785 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003786 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3787 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3788 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3789 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003790
3791 /* Initialize the PCU interface abstraction */
3792 f_init_raw(testcasename(), info_ind);
3793
3794 /* Establish BSSGP connection to the PCU */
3795 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003796 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003797
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003798 /* Establish an Uplink TBF for each GprsMS instance */
3799 f_multi_ms_establish_tbf(do_activate := false);
3800
3801 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003802 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003803 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003804 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003805 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003806 f_shutdown(__BFILE__, __LINE__);
3807 }
3808 }
3809
3810 f_shutdown(__BFILE__, __LINE__, final := true);
3811}
3812
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003813/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3814 * downgraded to CS1-4 so that GPRS can read the USF).
3815 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3816 */
3817testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3818 var PCUIF_info_ind info_ind;
3819 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3820 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003821 var uint32_t sched_fn, dl_fn, ack_fn;
3822 var octetstring data := f_rnd_octstring(10);
3823 var RlcmacDlBlock dl_block;
3824 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003825 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003826 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3827 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3828
3829 /* Initialize NS/BSSGP side */
3830 f_init_bssgp();
3831 /* Initialize GPRS MS side */
3832 f_init_gprs_ms(num_ms);
3833
3834 info_ind := valueof(ts_PCUIF_INFO_default);
3835 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003836 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3837 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003838
3839 /* Initialize the PCU interface abstraction */
3840 f_init_raw(testcasename(), info_ind);
3841
3842 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3843 g_mcs_initial_dl := 5;
3844 g_mcs_max_dl := 5;
3845 f_pcuvty_set_allowed_cs_mcs();
3846
3847 /* Establish BSSGP connection to the PCU */
3848 f_bssgp_establish();
3849 f_multi_ms_bssgp_register();
3850
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003851 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003852 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 +01003853 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3854 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3855 f_shutdown(__BFILE__, __LINE__);
3856 }
3857 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3858 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3859
3860 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003861 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 +01003862 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3863 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3864 f_shutdown(__BFILE__, __LINE__);
3865 }
3866 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3867 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3868
3869 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3870 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3871 f_sleep(0.1);
3872 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3873 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3874 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3875 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3876 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3877 /* ACK the DL block */
3878 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3879 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3880 f_dl_block_ack_fn(dl_block, dl_fn));
3881
3882 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3883 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3884 f_sleep(0.1);
3885 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3886 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3887 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3888 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3889 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3890 /* ACK the DL block */
3891 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3892 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3893 f_dl_block_ack_fn(dl_block, dl_fn));
3894
3895 data := f_rnd_octstring(1400);
3896 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3897 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3898
3899 for (var integer i := 0; i < 800; i := i + 1) {
3900 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3901
3902 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3903 /* No more data to receive, done */
3904 break;
3905 }
3906
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003907 usf_ms := -1;
3908
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003909 if (ischosen(dl_block.ctrl)) {
3910 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3911 f_shutdown(__BFILE__, __LINE__);
3912 } else if (ischosen(dl_block.data_egprs)) {
3913 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3914 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3915 f_shutdown(__BFILE__, __LINE__);
3916 }
3917 tgt_ms := 1;
3918 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3919 if (dl_block.data_egprs.mcs > MCS_4) {
3920 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3921 f_shutdown(__BFILE__, __LINE__);
3922 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003923 usf_ms := 0;
3924 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003925 } else {
3926 if (dl_block.data_egprs.mcs <= MCS_4) {
3927 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3928 f_shutdown(__BFILE__, __LINE__);
3929 }
3930 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003931 usf_ms := 1;
3932 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003933 }
3934 }
3935 } else {
3936 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3937 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3938 f_shutdown(__BFILE__, __LINE__);
3939 }
3940 tgt_ms := 0;
3941 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 +01003942 usf_ms := 0;
3943 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003944 } 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 +01003945 usf_ms := 1;
3946 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003947 }
3948 }
3949
3950 /* Keep Ack/Nack description updated */
3951 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3952
3953 /* TDMA frame number on which we are supposed to send the ACK */
3954 if (f_dl_block_rrbp_valid(dl_block)) {
3955 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3956 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);
3957 if (tx_data_remain != 0) {
3958 /* Submit more data from time to time to keep the TBF ongoing */
3959 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3960 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3961 tx_data_remain := tx_data_remain - 1;
3962 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003963 } else if (tx_data_remain != 0) {
3964 /* keep sending UL blocks when requested by USF to avoid
3965 * UL TBF timeout and hence stop receival of USFs */
3966 if (usf_ms != -1) {
3967 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
3968 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003969 }
3970 }
3971
3972 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 +01003973 /* He we check that DL blocks scheduled at GPRS can still request UL
3974 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
3975 * condition also ensures the downgrade to <=MCS4 condition is tested
3976 * above */
3977 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
3978 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003979 f_shutdown(__BFILE__, __LINE__);
3980 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003981 /* Here check for some level of fairness between them (at least ~40%): */
3982 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
3983 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
3984 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
3985 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
3986 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3987 f_shutdown(__BFILE__, __LINE__);
3988 }
3989 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
3990 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3991 f_shutdown(__BFILE__, __LINE__);
3992 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003993
3994 f_shutdown(__BFILE__, __LINE__, final := true);
3995}
3996
3997
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003998private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3999 boolean exp_imsi, boolean exp_tmsi)
4000runs on RAW_PCU_Test_CT {
4001 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4002 var integer pending := lengthof(g_ms);
4003 var RlcmacDlBlock dl_block;
4004 var boolean f1, f2;
4005
4006 while (pending > 0) {
4007 var uint32_t poll_fn;
4008
4009 /* Obtain a Downlink block and make sure it is a paging request */
4010 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4011 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4012 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4013 break;
4014 }
4015
4016 /* This should not happen in general, but who knows... */
4017 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4018 if (not ispresent(req.repeated_pageinfo)) {
4019 setverdict(fail, "Repeated Page Info IE is absent?!?");
4020 break;
4021 }
4022
4023 /* A single message may contain several MIs depending on their type */
4024 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4025 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4026 ps_domain := false);
4027 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4028 ps_domain := false);
4029 if (not f1 and not f2)
4030 { continue; }
4031
4032 /* Detect duplicate MIs */
4033 if (mask[i] == '1'B) {
4034 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4035 continue;
4036 }
4037
4038 mask[i] := '1'B;
4039 }
4040
4041 pending := pending - lengthof(req.repeated_pageinfo);
4042 }
4043
4044 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4045 if (mask[i] != '1'B) {
4046 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4047 log("===== mask := ", mask);
4048 }
4049 }
4050
4051 /* All messages must have been received by now, expect a dummy block */
4052 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4053}
4054
4055private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4056runs on RAW_PCU_Test_CT {
4057 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4058 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4059
4060 /* Initialize NS/BSSGP side */
4061 f_init_bssgp();
4062
4063 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004064 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004065
4066 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4067 f_init_gprs_ms(7 * 8);
4068
4069 /* Initialize the PCU interface abstraction */
4070 f_init_raw(testcasename(), info_ind);
4071
4072 /* Establish BSSGP connection to the PCU */
4073 f_bssgp_establish();
4074 f_multi_ms_bssgp_register();
4075
4076 /* Establish an Uplink TBF for each GprsMS instance */
4077 f_multi_ms_establish_tbf(do_activate := true);
4078}
4079
4080testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4081 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4082
4083 /* Common part: send INFO.ind, establish TBFs... */
4084 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4085
4086 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4087 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4088 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4089 }
4090
4091 /* FIXME: work around a race condition between PCUIF and BSSGP */
4092 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4093
4094 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4095 * The IUT is expected to page on all PDCH slots of all transceivers. */
4096 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4097 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4098 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4099 }
4100
4101 f_shutdown(__BFILE__, __LINE__, final := true);
4102}
4103
4104testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4105 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4106
4107 /* Common part: send INFO.ind, establish TBFs... */
4108 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4109
4110 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4111 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4112 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4113 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4114 }
4115
4116 /* FIXME: work around a race condition between PCUIF and BSSGP */
4117 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4118
4119 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4120 * The IUT is expected to page on all PDCH slots of all transceivers. */
4121 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4122 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4123 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4124 }
4125
4126 f_shutdown(__BFILE__, __LINE__, final := true);
4127}
4128
4129testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4130 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4131
4132 /* Common part: send INFO.ind, establish TBFs... */
4133 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4134
4135 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4136 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4137 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4138 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4139 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4140 } else {
4141 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4142 }
4143 }
4144
4145 /* FIXME: work around a race condition between PCUIF and BSSGP */
4146 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4147
4148 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4149 * The IUT is expected to page on all PDCH slots of all transceivers. */
4150 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4151 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4152 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4153 }
4154
4155 f_shutdown(__BFILE__, __LINE__, final := true);
4156}
4157
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004158private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004159runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4160 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004161 var integer i := 0;
4162 while (true) {
4163 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4164 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4165 break;
4166 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004167 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004168 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4169 f_shutdown(__BFILE__, __LINE__);
4170 }
4171 i := i + 1;
4172 }
4173 return dl_block;
4174}
4175
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004176private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4177runs on RAW_PCU_Test_CT {
4178 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),
4179 info_ind.lac),
4180 info_ind.rac),
4181 info_ind.cell_id));
4182 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4183 423),
4184 2),
4185 5));
4186 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4187 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4188 var template (value) RAN_Information_RIM_Container res_cont :=
4189 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4190 ts_RIM_Sequence_Number(2),
4191 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4192 ts_RIM_Protocol_Version_Number(1),
4193 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4194 omit);
4195 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4196 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4197 res_cont));
4198}
4199
4200altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4201runs on RAW_PCU_Test_CT {
4202 /* RIM procedure: */
4203 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),
4204 info_ind.lac),
4205 info_ind.rac),
4206 info_ind.cell_id));
4207 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4208 423),
4209 2),
4210 5));
4211 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4212 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4213 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4214 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4215 tr_RAN_Information_Request_RIM_Container)) {
4216 if (do_answer) {
4217 f_outbound_nacc_rim_tx_resp(info_ind);
4218 }
4219 if (do_repeat) {
4220 repeat;
4221 }
4222 }
4223}
4224
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004225/* Start NACC from MS side */
4226private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004227 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4228 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004229runs on RAW_PCU_Test_CT {
4230 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4231 var RlcmacDlBlock dl_block;
4232 var uint32_t sched_fn;
4233 var GsmArfcn req_arfcn := 862;
4234 var uint6_t req_bsic := 43;
4235
4236 /* Start NACC from MS side */
4237 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4238 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4239
4240 if (exp_rac_ci_query == true) {
4241 /* osmo-pcu should now ask for resolution: */
4242 f_ipa_ctrl_wait_link_up();
4243 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4244 int2str(info_ind.lac) & "." &
4245 int2str(info_ind.cell_id) & "." &
4246 int2str(req_arfcn) & "." &
4247 int2str(req_bsic);
4248 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4249 }
4250
4251 if (exp_si_query == true) {
4252 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004253 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004254 }
4255
4256 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004257 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004258
4259 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4260 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4261 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4262 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4263 f_shutdown(__BFILE__, __LINE__);
4264 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004265 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004266 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004267 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4268 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4269 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004270}
4271
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004272/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4273testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004274 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004275 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004276 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004277
4278 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4279 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4280
4281 /* Initialize NS/BSSGP side */
4282 f_init_bssgp();
4283 /* Initialize GPRS MS side */
4284 f_init_gprs_ms();
4285 ms := g_ms[0]; /* We only use first MS in this test */
4286
4287 /* Initialize the PCU interface abstraction */
4288 f_init_raw(testcasename(), info_ind);
4289
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004290 /* Make sure we are not affected by full cache from previous tests */
4291 f_pcuvty_flush_neigh_caches();
4292
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004293 /* Establish BSSGP connection to the PCU */
4294 f_bssgp_establish();
4295 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4296
4297 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004298 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 +01004299 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4300 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4301
4302 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004303 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004304
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004305 f_shutdown(__BFILE__, __LINE__, final := true);
4306}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004307
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004308/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4309testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4310 var PollFnCtx pollctx;
4311 var GprsMS ms;
4312 var RlcmacDlBlock dl_block;
4313 var uint32_t sched_fn;
4314 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004315
4316 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4317 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4318
4319 /* Initialize NS/BSSGP side */
4320 f_init_bssgp();
4321 /* Initialize GPRS MS side */
4322 f_init_gprs_ms();
4323 ms := g_ms[0]; /* We only use first MS in this test */
4324
4325 /* Initialize the PCU interface abstraction */
4326 f_init_raw(testcasename(), info_ind);
4327
4328 /* Make sure we are not affected by full cache from previous tests */
4329 f_pcuvty_flush_neigh_caches();
4330
4331 /* Establish BSSGP connection to the PCU */
4332 f_bssgp_establish();
4333 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4334
4335 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004336 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 +01004337 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4338 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4339
4340 /* Start NACC from MS side, avoid sending final CTRL ACK */
4341 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4342
4343 /* Wait until we receive something non-dummy */
4344 dl_block := f_skip_dummy(0, sched_fn);
4345 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4346 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4347 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4348 }
4349 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4350 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4351 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4352 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4353 }
4354
4355 f_shutdown(__BFILE__, __LINE__, final := true);
4356}
4357
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004358/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4359testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4360 var PollFnCtx pollctx;
4361 var GprsMS ms;
4362 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004363 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004364
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004365 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4366 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004367
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004368 /* Initialize NS/BSSGP side */
4369 f_init_bssgp();
4370 /* Initialize GPRS MS side */
4371 f_init_gprs_ms();
4372 ms := g_ms[0]; /* We only use first MS in this test */
4373
4374 /* Initialize the PCU interface abstraction */
4375 f_init_raw(testcasename(), info_ind);
4376
4377 /* Make sure we are not affected by full cache from previous tests */
4378 f_pcuvty_flush_neigh_caches();
4379 /* Set timeout values for caches so that entries will be in cache during second try */
4380 f_pcuvty_set_neigh_caches(10, 10);
4381
4382 /* Establish BSSGP connection to the PCU */
4383 f_bssgp_establish();
4384 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4385
4386 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004387 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 +01004388 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4389 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4390
4391 /* Start NACC from MS side */
4392 f_outbound_nacc_success(ms, info_ind);
4393
4394 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4395 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004396
4397 f_shutdown(__BFILE__, __LINE__, final := true);
4398}
4399
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004400/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4401 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4402 */
4403testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4404 var PollFnCtx pollctx;
4405 var GprsMS ms;
4406 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004407 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4408
4409 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4410 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4411
4412 /* Initialize NS/BSSGP side */
4413 f_init_bssgp();
4414 /* Initialize GPRS MS side */
4415 f_init_gprs_ms();
4416 ms := g_ms[0]; /* We only use first MS in this test */
4417
4418 /* Initialize the PCU interface abstraction */
4419 f_init_raw(testcasename(), info_ind);
4420
4421 /* Make sure we are not affected by full cache from previous tests */
4422 f_pcuvty_flush_neigh_caches();
4423 /* Set timeout values for caches so that entries will be erased before the second try */
4424 f_pcuvty_set_neigh_caches(1, 1);
4425
4426 /* Establish BSSGP connection to the PCU */
4427 f_bssgp_establish();
4428 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4429
4430 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004431 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 +01004432 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4433 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4434
4435 /* Start NACC from MS side */
4436 f_outbound_nacc_success(ms, info_ind);
4437
4438 /* CTRL client should have disconnected from us */
4439 f_ipa_ctrl_wait_link_down();
4440 /* wait for cache entries to time out */
4441 f_sleep(2.0);
4442 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4443 f_outbound_nacc_success(ms, info_ind);
4444
4445 f_shutdown(__BFILE__, __LINE__, final := true);
4446}
4447
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004448/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004449testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4450 var RlcmacDlBlock dl_block;
4451 var PollFnCtx pollctx;
4452 var uint32_t sched_fn;
4453 var GprsMS ms;
4454 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4455 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004456 var GsmArfcn req_arfcn := 862;
4457 var uint6_t req_bsic := 43;
4458
4459 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4460 * resolution CTRL port, to trigger Conn Refused by socket:
4461 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4462 */
4463
4464 /* Initialize NS/BSSGP side */
4465 f_init_bssgp();
4466 /* Initialize GPRS MS side */
4467 f_init_gprs_ms();
4468 ms := g_ms[0]; /* We only use first MS in this test */
4469
4470 /* Initialize the PCU interface abstraction */
4471 f_init_raw(testcasename(), info_ind);
4472
4473 /* Make sure we are not affected by full cache from previous tests */
4474 f_pcuvty_flush_neigh_caches();
4475
4476 /* Establish BSSGP connection to the PCU */
4477 f_bssgp_establish();
4478 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4479
4480 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004481 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 +01004482 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4483 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4484
4485 /* Start NACC from MS side */
4486 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4487 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4488
4489 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004490 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004491 /* Make sure it is a Pkt Cell Chg Continue */
4492 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4493 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4494 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004495 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4496 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4497 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4498 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4499 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004500
4501 f_shutdown(__BFILE__, __LINE__, final := true);
4502}
4503
4504/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004505testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4506 var RlcmacDlBlock dl_block;
4507 var PollFnCtx pollctx;
4508 var uint32_t sched_fn;
4509 var GprsMS ms;
4510 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4511 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004512 var GsmArfcn req_arfcn := 862;
4513 var uint6_t req_bsic := 43;
4514
4515 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4516 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4517
4518 /* Initialize NS/BSSGP side */
4519 f_init_bssgp();
4520 /* Initialize GPRS MS side */
4521 f_init_gprs_ms();
4522 ms := g_ms[0]; /* We only use first MS in this test */
4523
4524 /* Initialize the PCU interface abstraction */
4525 f_init_raw(testcasename(), info_ind);
4526
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004527 /* Make sure we are not affected by full cache from previous tests */
4528 f_pcuvty_flush_neigh_caches();
4529
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004530 /* Establish BSSGP connection to the PCU */
4531 f_bssgp_establish();
4532 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4533
4534 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004535 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 +01004536 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4537 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4538
4539 /* Start NACC from MS side */
4540 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4541 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4542
4543 /* osmo-pcu should now ask for resolution: */
4544 f_ipa_ctrl_wait_link_up();
4545 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4546 int2str(info_ind.lac) & "." &
4547 int2str(info_ind.cell_id) & "." &
4548 int2str(req_arfcn) & "." &
4549 int2str(req_bsic);
4550 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4551 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4552
4553 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004554 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004555 /* Make sure it is a Pkt Cell Chg Continue */
4556 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4557 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4558 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004559 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4560 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4561 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4562 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4563 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004564
4565 f_shutdown(__BFILE__, __LINE__, final := true);
4566}
4567
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004568/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4569testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4570 var RlcmacDlBlock dl_block;
4571 var PollFnCtx pollctx;
4572 var uint32_t sched_fn;
4573 var GprsMS ms;
4574 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4575 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004576 var GsmArfcn req_arfcn := 862;
4577 var uint6_t req_bsic := 43;
4578
4579 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4580 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4581
4582 /* Initialize NS/BSSGP side */
4583 f_init_bssgp();
4584 /* Initialize GPRS MS side */
4585 f_init_gprs_ms();
4586 ms := g_ms[0]; /* We only use first MS in this test */
4587
4588 /* Initialize the PCU interface abstraction */
4589 f_init_raw(testcasename(), info_ind);
4590
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004591 /* Make sure we are not affected by full cache from previous tests */
4592 f_pcuvty_flush_neigh_caches();
4593
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004594 /* Establish BSSGP connection to the PCU */
4595 f_bssgp_establish();
4596 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4597
4598 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004599 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 +01004600 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4601 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4602
4603 /* Start NACC from MS side */
4604 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4605 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4606
4607 /* osmo-pcu should now ask for resolution: */
4608 f_ipa_ctrl_wait_link_up();
4609 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4610 int2str(info_ind.lac) & "." &
4611 int2str(info_ind.cell_id) & "." &
4612 int2str(req_arfcn) & "." &
4613 int2str(req_bsic);
4614 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4615 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4616
4617 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004618 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004619 /* Make sure it is a Pkt Cell Chg Continue */
4620 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4621 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4622 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004623 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4624 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4625 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4626 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4627 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004628
4629 f_shutdown(__BFILE__, __LINE__, final := true);
4630}
4631
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004632/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4633testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4634 var RlcmacDlBlock dl_block;
4635 var PollFnCtx pollctx;
4636 var uint32_t sched_fn;
4637 var GprsMS ms;
4638 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4639 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004640 var GsmArfcn req_arfcn := 862;
4641 var uint6_t req_bsic := 43;
4642 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 */
4643 info_ind.lac),
4644 info_ind.rac),
4645 info_ind.cell_id));
4646 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4647 423),
4648 2),
4649 5));
4650 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4651 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4652
4653 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4654 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4655
4656 /* Initialize NS/BSSGP side */
4657 f_init_bssgp();
4658 /* Initialize GPRS MS side */
4659 f_init_gprs_ms();
4660 ms := g_ms[0]; /* We only use first MS in this test */
4661
4662 /* Initialize the PCU interface abstraction */
4663 f_init_raw(testcasename(), info_ind);
4664
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004665 /* Make sure we are not affected by full cache from previous tests */
4666 f_pcuvty_flush_neigh_caches();
4667
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004668 /* Establish BSSGP connection to the PCU */
4669 f_bssgp_establish();
4670 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4671
4672 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004673 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 +01004674 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4675 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4676
4677 /* Start NACC from MS side */
4678 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4679 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4680
4681 /* osmo-pcu should now ask for resolution: */
4682 f_ipa_ctrl_wait_link_up();
4683 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4684 int2str(info_ind.lac) & "." &
4685 int2str(info_ind.cell_id) & "." &
4686 int2str(req_arfcn) & "." &
4687 int2str(req_bsic);
4688 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4689
4690 /* RIM procedure: */
4691 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4692 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4693 tr_RAN_Information_Request_RIM_Container));
4694 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4695
4696 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004697 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004698 /* Make sure it is a Pkt Cell Chg Continue */
4699 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4700 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4701 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004702 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4703 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4704 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4705 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4706 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004707
4708 f_shutdown(__BFILE__, __LINE__, final := true);
4709}
4710
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004711/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4712testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4713 var PollFnCtx pollctx;
4714 var GprsMS ms;
4715 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4716 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4717 var RlcmacDlBlock dl_block;
4718 var uint32_t sched_fn;
4719 var CtrlMessage rx_ctrl;
4720 var GsmArfcn req_arfcn := 862;
4721 var uint6_t req_bsic := 43;
4722
4723 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4724 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4725
4726 /* Initialize NS/BSSGP side */
4727 f_init_bssgp();
4728 /* Initialize GPRS MS side */
4729 f_init_gprs_ms();
4730 ms := g_ms[0]; /* We only use first MS in this test */
4731
4732 /* Initialize the PCU interface abstraction */
4733 f_init_raw(testcasename(), info_ind);
4734
4735 /* Make sure we are not affected by full cache from previous tests */
4736 f_pcuvty_flush_neigh_caches();
4737
4738 /* Establish BSSGP connection to the PCU */
4739 f_bssgp_establish();
4740 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4741
4742 /* Send PACKET RESOURCE REQUEST */
4743 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4744 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4745 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4746
4747 /* Start NACC from MS side */
4748 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4749 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4750
4751 /* osmo-pcu should now ask for resolution: */
4752 f_ipa_ctrl_wait_link_up();
4753 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4754 int2str(info_ind.lac) & "." &
4755 int2str(info_ind.cell_id) & "." &
4756 int2str(req_arfcn) & "." &
4757 int2str(req_bsic);
4758 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4759 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4760 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4761 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4762 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4763 timer T := 2.0;
4764 T.start;
4765 alt {
4766 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4767 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4768 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4769 f_shutdown(__BFILE__, __LINE__);
4770 }
4771 [] T.timeout {
4772 setverdict(pass);
4773 }
4774 }
4775
4776 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004777 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004778
4779 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4780 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4781 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4782 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4783 f_shutdown(__BFILE__, __LINE__);
4784 }
4785 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4786 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4787 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4788 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4789 }
4790
4791 f_shutdown(__BFILE__, __LINE__, final := true);
4792}
4793
4794/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4795testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4796 var PollFnCtx pollctx;
4797 var GprsMS ms;
4798 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4799 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4800 var RlcmacDlBlock dl_block;
4801 var uint32_t sched_fn;
4802 var CtrlMessage rx_ctrl;
4803 var GsmArfcn req_arfcn := 862;
4804 var uint6_t req_bsic := 43;
4805
4806 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4807 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4808
4809 /* Initialize NS/BSSGP side */
4810 f_init_bssgp();
4811 /* Initialize GPRS MS side */
4812 f_init_gprs_ms();
4813 ms := g_ms[0]; /* We only use first MS in this test */
4814
4815 /* Initialize the PCU interface abstraction */
4816 f_init_raw(testcasename(), info_ind);
4817
4818 /* Make sure we are not affected by full cache from previous tests */
4819 f_pcuvty_flush_neigh_caches();
4820
4821 /* Establish BSSGP connection to the PCU */
4822 f_bssgp_establish();
4823 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4824
4825 /* Send PACKET RESOURCE REQUEST */
4826 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4827 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4828 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4829
4830 /* Start NACC from MS side */
4831 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4832 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4833
4834 /* osmo-pcu should now ask for resolution: */
4835 f_ipa_ctrl_wait_link_up();
4836 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4837 int2str(info_ind.lac) & "." &
4838 int2str(info_ind.cell_id) & "." &
4839 int2str(req_arfcn) & "." &
4840 int2str(req_bsic);
4841 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4842 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4843 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4844 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4845 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4846 f_outbound_nacc_rim_tx_resp(info_ind);
4847 timer T := 1.0;
4848 T.start;
4849 alt {
4850 [] RIM.receive {
4851 setverdict(fail, "Received unexpected RIM message");
4852 f_shutdown(__BFILE__, __LINE__);
4853 }
4854 [] T.timeout {
4855 setverdict(pass);
4856 }
4857 }
4858
4859 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004860 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004861
4862 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4863 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4864 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4865 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4866 f_shutdown(__BFILE__, __LINE__);
4867 }
4868 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4869 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4870 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4871 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4872 }
4873
4874 f_shutdown(__BFILE__, __LINE__, final := true);
4875}
4876
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004877/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4878testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4879 var PollFnCtx pollctx;
4880 var GprsMS ms;
4881 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4882 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4883 var RlcmacDlBlock dl_block;
4884 var uint32_t sched_fn;
4885 var CtrlMessage rx_ctrl;
4886 var GsmArfcn req_arfcn := 862;
4887 var uint6_t req_bsic := 43;
4888
4889 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4890 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4891
4892 /* Initialize NS/BSSGP side */
4893 f_init_bssgp();
4894 /* Initialize GPRS MS side */
4895 f_init_gprs_ms();
4896 ms := g_ms[0]; /* We only use first MS in this test */
4897
4898 /* Initialize the PCU interface abstraction */
4899 f_init_raw(testcasename(), info_ind);
4900
4901 /* Make sure we are not affected by full cache from previous tests */
4902 f_pcuvty_flush_neigh_caches();
4903
4904 /* Establish BSSGP connection to the PCU */
4905 f_bssgp_establish();
4906 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4907
4908 /* Send PACKET RESOURCE REQUEST */
4909 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4910 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4911 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4912
4913 /* Start NACC from MS side */
4914 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4915 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4916
4917 /* osmo-pcu should now ask for resolution: */
4918 f_ipa_ctrl_wait_link_up();
4919 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4920 int2str(info_ind.lac) & "." &
4921 int2str(info_ind.cell_id) & "." &
4922 int2str(req_arfcn) & "." &
4923 int2str(req_bsic);
4924 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4925 /* RIM procedure: */
4926 as_outbound_nacc_rim_resolve(info_ind);
4927
4928 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4929 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4930 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4931
4932 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4933 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4934
4935 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4936 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4937 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4938 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4939 f_shutdown(__BFILE__, __LINE__);
4940 }
4941 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4942 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4943 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4944 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4945 }
4946}
4947
4948/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4949testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4950 var PollFnCtx pollctx;
4951 var GprsMS ms;
4952 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4953 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4954 var RlcmacDlBlock dl_block;
4955 var uint32_t sched_fn;
4956 var CtrlMessage rx_ctrl;
4957 var GsmArfcn req_arfcn := 862;
4958 var uint6_t req_bsic := 43;
4959
4960 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4961 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4962
4963 /* Initialize NS/BSSGP side */
4964 f_init_bssgp();
4965 /* Initialize GPRS MS side */
4966 f_init_gprs_ms();
4967 ms := g_ms[0]; /* We only use first MS in this test */
4968
4969 /* Initialize the PCU interface abstraction */
4970 f_init_raw(testcasename(), info_ind);
4971
4972 /* Make sure we are not affected by full cache from previous tests */
4973 f_pcuvty_flush_neigh_caches();
4974
4975 /* Establish BSSGP connection to the PCU */
4976 f_bssgp_establish();
4977 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4978
4979 /* Send PACKET RESOURCE REQUEST */
4980 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4981 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4982 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4983
4984 /* Start NACC from MS side */
4985 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4986 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4987
4988 /* osmo-pcu should now ask for resolution: */
4989 f_ipa_ctrl_wait_link_up();
4990 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4991 int2str(info_ind.lac) & "." &
4992 int2str(info_ind.cell_id) & "." &
4993 int2str(req_arfcn) & "." &
4994 int2str(req_bsic);
4995 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4996 /* RIM procedure: */
4997 as_outbound_nacc_rim_resolve(info_ind);
4998
4999 /* Announce SI back to MS, continue NACC procedure */
5000 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5001
5002 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5003 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5004
5005 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5006 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5007 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5008 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5009 f_shutdown(__BFILE__, __LINE__);
5010 }
5011 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5012 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5013 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5014 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5015 }
5016}
5017
5018/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5019testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5020 var PollFnCtx pollctx;
5021 var GprsMS ms;
5022 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5023 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5024 var RlcmacDlBlock dl_block;
5025 var uint32_t sched_fn;
5026 var CtrlMessage rx_ctrl;
5027 var GsmArfcn req_arfcn := 862;
5028 var uint6_t req_bsic := 43;
5029
5030 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5031 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5032
5033 /* Initialize NS/BSSGP side */
5034 f_init_bssgp();
5035 /* Initialize GPRS MS side */
5036 f_init_gprs_ms();
5037 ms := g_ms[0]; /* We only use first MS in this test */
5038
5039 /* Initialize the PCU interface abstraction */
5040 f_init_raw(testcasename(), info_ind);
5041
5042 /* Make sure we are not affected by full cache from previous tests */
5043 f_pcuvty_flush_neigh_caches();
5044
5045 /* Establish BSSGP connection to the PCU */
5046 f_bssgp_establish();
5047 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5048
5049 /* Send PACKET RESOURCE REQUEST */
5050 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5051 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5052 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5053
5054 /* Start NACC from MS side */
5055 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5056 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5057
5058 /* osmo-pcu should now ask for resolution: */
5059 f_ipa_ctrl_wait_link_up();
5060 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5061 int2str(info_ind.lac) & "." &
5062 int2str(info_ind.cell_id) & "." &
5063 int2str(req_arfcn) & "." &
5064 int2str(req_bsic);
5065 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5066 /* RIM procedure: */
5067 as_outbound_nacc_rim_resolve(info_ind);
5068
5069 /* Announce SI back to MS, continue NACC procedure */
5070 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5071
5072 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5073 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5074 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5075 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5076 f_shutdown(__BFILE__, __LINE__);
5077 }
5078 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5079 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5080
5081 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5082 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5083 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5084 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5085 }
5086}
5087
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005088/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5089 * while waiting for CTRL resolution */
5090testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5091 var PollFnCtx pollctx;
5092 var GprsMS ms;
5093 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5094 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5095 var RlcmacDlBlock dl_block;
5096 var uint32_t sched_fn;
5097 var CtrlMessage rx_ctrl;
5098 var GsmArfcn req_arfcn := 862;
5099 var uint6_t req_bsic := 43;
5100
5101 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5102 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5103
5104 /* Initialize NS/BSSGP side */
5105 f_init_bssgp();
5106 /* Initialize GPRS MS side */
5107 f_init_gprs_ms();
5108 ms := g_ms[0]; /* We only use first MS in this test */
5109
5110 /* Initialize the PCU interface abstraction */
5111 f_init_raw(testcasename(), info_ind);
5112
5113 /* Make sure we are not affected by full cache from previous tests */
5114 f_pcuvty_flush_neigh_caches();
5115
5116 /* Establish BSSGP connection to the PCU */
5117 f_bssgp_establish();
5118 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5119
5120 /* Send PACKET RESOURCE REQUEST */
5121 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5122 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5123 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5124
5125 /* Start NACC from MS side */
5126 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5127 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5128
5129 /* osmo-pcu should now ask for resolution: */
5130 f_ipa_ctrl_wait_link_up();
5131 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5132 int2str(info_ind.lac) & "." &
5133 int2str(info_ind.cell_id) & "." &
5134 int2str(req_arfcn) & "." &
5135 int2str(req_bsic);
5136 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5137 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5138 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5139 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5140 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5141 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5142 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5143 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5144 int2str(info_ind.lac) & "." &
5145 int2str(info_ind.cell_id) & "." &
5146 int2str(req_arfcn + 1) & "." &
5147 int2str(req_bsic + 1);
5148 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5149
5150 /* And finally everything continues as usual with RIN procedure */
5151 as_outbound_nacc_rim_resolve(info_ind);
5152
5153 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005154 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005155
5156 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5157 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5158 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5159 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5160 f_shutdown(__BFILE__, __LINE__);
5161 }
5162 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5163 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5164 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5165 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5166 }
5167
5168 f_shutdown(__BFILE__, __LINE__, final := true);
5169}
5170
5171/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5172 * while waiting for SI resolution */
5173testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5174 var PollFnCtx pollctx;
5175 var GprsMS ms;
5176 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5177 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5178 var RlcmacDlBlock dl_block;
5179 var uint32_t sched_fn;
5180 var CtrlMessage rx_ctrl;
5181 var GsmArfcn req_arfcn := 862;
5182 var uint6_t req_bsic := 43;
5183
5184 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5185 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5186
5187 /* Initialize NS/BSSGP side */
5188 f_init_bssgp();
5189 /* Initialize GPRS MS side */
5190 f_init_gprs_ms();
5191 ms := g_ms[0]; /* We only use first MS in this test */
5192
5193 /* Initialize the PCU interface abstraction */
5194 f_init_raw(testcasename(), info_ind);
5195
5196 /* Make sure we are not affected by full cache from previous tests */
5197 f_pcuvty_flush_neigh_caches();
5198
5199 /* Establish BSSGP connection to the PCU */
5200 f_bssgp_establish();
5201 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5202
5203 /* Send PACKET RESOURCE REQUEST */
5204 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5205 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5206 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5207
5208 /* Start NACC from MS side */
5209 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5210 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5211
5212 /* osmo-pcu should now ask for resolution: */
5213 f_ipa_ctrl_wait_link_up();
5214 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5215 int2str(info_ind.lac) & "." &
5216 int2str(info_ind.cell_id) & "." &
5217 int2str(req_arfcn) & "." &
5218 int2str(req_bsic);
5219 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5220 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5221 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5222 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5223 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5224 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5225 f_outbound_nacc_rim_tx_resp(info_ind);
5226
5227 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5228 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5229 int2str(info_ind.lac) & "." &
5230 int2str(info_ind.cell_id) & "." &
5231 int2str(req_arfcn + 1) & "." &
5232 int2str(req_bsic + 1);
5233 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5234
5235 /* And finally everything continues as usual with RIN procedure */
5236 as_outbound_nacc_rim_resolve(info_ind);
5237
5238 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005239 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005240
5241 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5242 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5243 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5244 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5245 f_shutdown(__BFILE__, __LINE__);
5246 }
5247 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5248 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5249 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5250 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5251 }
5252
5253 f_shutdown(__BFILE__, __LINE__, final := true);
5254}
5255
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005256/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5257 * while sending Pkt Neigh Data Change */
5258testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5259 var PollFnCtx pollctx;
5260 var GprsMS ms;
5261 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5262 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5263 var RlcmacDlBlock dl_block;
5264 var uint32_t sched_fn;
5265 var CtrlMessage rx_ctrl;
5266 var GsmArfcn req_arfcn := 862;
5267 var uint6_t req_bsic := 43;
5268
5269 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5270 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5271
5272 /* Initialize NS/BSSGP side */
5273 f_init_bssgp();
5274 /* Initialize GPRS MS side */
5275 f_init_gprs_ms();
5276 ms := g_ms[0]; /* We only use first MS in this test */
5277
5278 /* Initialize the PCU interface abstraction */
5279 f_init_raw(testcasename(), info_ind);
5280
5281 /* Make sure we are not affected by full cache from previous tests */
5282 f_pcuvty_flush_neigh_caches();
5283
5284 /* Establish BSSGP connection to the PCU */
5285 f_bssgp_establish();
5286 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5287
5288 /* Send PACKET RESOURCE REQUEST */
5289 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5290 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5291 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5292
5293 /* Start NACC from MS side */
5294 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5295 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5296
5297 /* osmo-pcu should now ask for resolution: */
5298 f_ipa_ctrl_wait_link_up();
5299 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5300 int2str(info_ind.lac) & "." &
5301 int2str(info_ind.cell_id) & "." &
5302 int2str(req_arfcn) & "." &
5303 int2str(req_bsic);
5304 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5305 /* RIM procedure: */
5306 as_outbound_nacc_rim_resolve(info_ind);
5307
5308 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5309 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5310 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5311 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5312
5313 /* It should trigger RAC_CI resolution to start again: */
5314 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5315 int2str(info_ind.lac) & "." &
5316 int2str(info_ind.cell_id) & "." &
5317 int2str(req_arfcn + 1) & "." &
5318 int2str(req_bsic + 1);
5319 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5320 /* RIM procedure: */
5321 as_outbound_nacc_rim_resolve(info_ind);
5322 /* Transmit SI back to MS */
5323 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5324
5325 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5326 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5327 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5328 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5329 f_shutdown(__BFILE__, __LINE__);
5330 }
5331 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5332 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5333 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5334 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5335 }
5336}
5337
5338/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5339testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5340 var PollFnCtx pollctx;
5341 var GprsMS ms;
5342 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5343 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5344 var RlcmacDlBlock dl_block;
5345 var uint32_t sched_fn;
5346 var CtrlMessage rx_ctrl;
5347 var GsmArfcn req_arfcn := 862;
5348 var uint6_t req_bsic := 43;
5349
5350 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5351 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5352
5353 /* Initialize NS/BSSGP side */
5354 f_init_bssgp();
5355 /* Initialize GPRS MS side */
5356 f_init_gprs_ms();
5357 ms := g_ms[0]; /* We only use first MS in this test */
5358
5359 /* Initialize the PCU interface abstraction */
5360 f_init_raw(testcasename(), info_ind);
5361
5362 /* Make sure we are not affected by full cache from previous tests */
5363 f_pcuvty_flush_neigh_caches();
5364
5365 /* Establish BSSGP connection to the PCU */
5366 f_bssgp_establish();
5367 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5368
5369 /* Send PACKET RESOURCE REQUEST */
5370 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5371 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5372 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5373
5374 /* Start NACC from MS side */
5375 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5376 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5377
5378 /* osmo-pcu should now ask for resolution: */
5379 f_ipa_ctrl_wait_link_up();
5380 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5381 int2str(info_ind.lac) & "." &
5382 int2str(info_ind.cell_id) & "." &
5383 int2str(req_arfcn) & "." &
5384 int2str(req_bsic);
5385 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5386 /* RIM procedure: */
5387 as_outbound_nacc_rim_resolve(info_ind);
5388
5389 /* Announce SI back to MS, continue NACC procedure */
5390 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5391
5392 /* trigger a Pkt Cell Change Notif with different tgt cell */
5393 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5394 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5395
5396 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5397 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5398
5399 /* It should trigger RAC_CI resolution to start again: */
5400 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5401 int2str(info_ind.lac) & "." &
5402 int2str(info_ind.cell_id) & "." &
5403 int2str(req_arfcn + 1) & "." &
5404 int2str(req_bsic + 1);
5405 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5406 /* RIM procedure: */
5407 as_outbound_nacc_rim_resolve(info_ind);
5408 /* Transmit SI back to MS */
5409 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5410
5411 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5412 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5413 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5414 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5415 f_shutdown(__BFILE__, __LINE__);
5416 }
5417 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5418 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5419 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5420 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5421 }
5422}
5423
5424/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5425testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5426 var PollFnCtx pollctx;
5427 var GprsMS ms;
5428 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5429 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5430 var RlcmacDlBlock dl_block;
5431 var uint32_t sched_fn;
5432 var CtrlMessage rx_ctrl;
5433 var GsmArfcn req_arfcn := 862;
5434 var uint6_t req_bsic := 43;
5435
5436 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5437 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5438
5439 /* Initialize NS/BSSGP side */
5440 f_init_bssgp();
5441 /* Initialize GPRS MS side */
5442 f_init_gprs_ms();
5443 ms := g_ms[0]; /* We only use first MS in this test */
5444
5445 /* Initialize the PCU interface abstraction */
5446 f_init_raw(testcasename(), info_ind);
5447
5448 /* Make sure we are not affected by full cache from previous tests */
5449 f_pcuvty_flush_neigh_caches();
5450
5451 /* Establish BSSGP connection to the PCU */
5452 f_bssgp_establish();
5453 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5454
5455 /* Send PACKET RESOURCE REQUEST */
5456 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5457 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5458 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5459
5460 /* Start NACC from MS side */
5461 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5462 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5463
5464 /* osmo-pcu should now ask for resolution: */
5465 f_ipa_ctrl_wait_link_up();
5466 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5467 int2str(info_ind.lac) & "." &
5468 int2str(info_ind.cell_id) & "." &
5469 int2str(req_arfcn) & "." &
5470 int2str(req_bsic);
5471 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5472 /* RIM procedure: */
5473 as_outbound_nacc_rim_resolve(info_ind);
5474
5475 /* Announce SI back to MS, continue NACC procedure */
5476 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5477
5478 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5479 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5480 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5481 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5482 f_shutdown(__BFILE__, __LINE__);
5483 }
5484
5485 /* trigger a Pkt Cell Change Notif with different tgt cell */
5486 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5487 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5488
5489 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5490 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5491 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5492 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5493 }
5494 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5495 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5496
5497 /* It should trigger RAC_CI resolution to start again: */
5498 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5499 int2str(info_ind.lac) & "." &
5500 int2str(info_ind.cell_id) & "." &
5501 int2str(req_arfcn + 1) & "." &
5502 int2str(req_bsic + 1);
5503 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5504 /* RIM procedure: */
5505 as_outbound_nacc_rim_resolve(info_ind);
5506 /* Transmit SI back to MS */
5507 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5508
5509 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5510 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5511 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5512 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5513 f_shutdown(__BFILE__, __LINE__);
5514 }
5515 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5516 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5517 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5518 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5519 }
5520}
5521
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005522/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5523testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5524 var PollFnCtx pollctx;
5525 var GprsMS ms;
5526 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5527 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5528 var RlcmacDlBlock dl_block;
5529 var uint32_t sched_fn, dl_fn;
5530 var CtrlMessage rx_ctrl;
5531 var GsmArfcn req_arfcn := 862;
5532 var uint6_t req_bsic := 43;
5533 var octetstring data := f_rnd_octstring(10);
5534
5535 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5536 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5537
5538 /* Initialize NS/BSSGP side */
5539 f_init_bssgp();
5540 /* Initialize GPRS MS side */
5541 f_init_gprs_ms();
5542 ms := g_ms[0]; /* We only use first MS in this test */
5543
5544 /* Initialize the PCU interface abstraction */
5545 f_init_raw(testcasename(), info_ind);
5546
5547 /* Make sure we are not affected by full cache from previous tests */
5548 f_pcuvty_flush_neigh_caches();
5549
5550 /* Establish BSSGP connection to the PCU */
5551 f_bssgp_establish();
5552 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5553
5554 /* Send PACKET RESOURCE REQUEST */
5555 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5556 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5557 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5558
5559 /* Start NACC from MS side */
5560 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5561 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5562
5563 /* osmo-pcu should now ask for resolution: */
5564 f_ipa_ctrl_wait_link_up();
5565 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5566 int2str(info_ind.lac) & "." &
5567 int2str(info_ind.cell_id) & "." &
5568 int2str(req_arfcn) & "." &
5569 int2str(req_bsic);
5570 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5571 /* RIM procedure: */
5572 as_outbound_nacc_rim_resolve(info_ind);
5573
5574 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5575 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5576 f_sleep(0.1);
5577 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5578 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5579
5580 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5581 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5582 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5583 * Data with unassigned DL TBF in line above): */
5584 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5585 /* Continue receiving Pkt Cell Neighbor Data */
5586 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5587
5588 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5589 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5590 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5591 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5592 f_shutdown(__BFILE__, __LINE__);
5593 }
5594 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5595 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5596 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5597 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5598 }
5599
5600 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5601 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5602 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5603 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5604 f_dl_block_ack_fn(dl_block, dl_fn));
5605}
5606
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005607/* Send a RIM RAN info request to the PCU and verify the response, we expect
5608 * getting the system information back which we have transfered to the PCU via
5609 * PCUIF on startup. */
5610testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5611 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005612 timer T := 2.0;
5613
5614 /* Initialize NS/BSSGP side */
5615 f_init_bssgp();
5616
5617 /* Initialize the PCU interface abstraction */
5618 f_init_raw(testcasename());
5619
5620 /* Establish BSSGP connection to the PCU */
5621 f_bssgp_establish();
5622
5623 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005624 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 +01005625 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005626 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 +01005627 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005628 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);
5629 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005630 f_sleep(1.0);
5631
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005632 var RIM_Routing_Address dst_addr;
5633 var RIM_Routing_Address src_addr;
5634 var template (value) RAN_Information_Request_RIM_Container req_cont;
5635 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005636 var template PDU_BSSGP bssgp_rim_pdu_expect;
5637 var template RAN_Information_RIM_Container rim_cont_expect;
5638
5639 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 +01005640 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5641 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005642
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005643 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5644 ts_RIM_Sequence_Number(1),
5645 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5646 ts_RIM_Protocol_Version_Number(1),
5647 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5648 omit);
5649 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5650 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5651 req_cont);
5652
5653 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5654 tr_RIM_Sequence_Number(1),
5655 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5656 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005657 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 +01005658 omit);
5659
5660 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5661 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5662 rim_cont_expect);
5663 RIM.send(bssgp_rim_pdu);
5664 T.start;
5665 alt {
5666 [] RIM.receive(bssgp_rim_pdu_expect) { }
5667 [] RIM.receive {
5668 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5669 }
5670 [] T.timeout {
5671 setverdict(fail, "No BSSGP RIM PDU received");
5672 mtc.stop;
5673 }
5674 }
5675
5676 f_shutdown(__BFILE__, __LINE__, final := true);
5677}
5678
5679/* Same as above, but in this case we simulate the rare case in which the PCU
5680 * has no system information available. We expect getting a response back but
5681 * with no system information inside. */
5682testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005683 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005684 var PCUIF_Message pcu_msg;
5685 timer T := 2.0;
5686
5687 /* Initialize NS/BSSGP side */
5688 f_init_bssgp();
5689
5690 /* Initialize the PCU interface abstraction */
5691 f_init_raw(testcasename(), info_ind);
5692
5693 /* Establish BSSGP connection to the PCU */
5694 f_bssgp_establish();
5695
5696 /* Clear sysinfo from the PCU */
5697 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);
5698 BTS.send(si1_data_ind);
5699 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);
5700 BTS.send(si3_data_ind);
5701 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);
5702 BTS.send(si16_data_ind);
5703 f_sleep(1.0);
5704
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005705 var RIM_Routing_Address dst_addr;
5706 var RIM_Routing_Address src_addr;
5707 var template (value) RAN_Information_Request_RIM_Container req_cont;
5708 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005709 var template PDU_BSSGP bssgp_rim_pdu_expect;
5710 var template RAN_Information_RIM_Container rim_cont_expect;
5711
5712 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 +01005713 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5714 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005715
5716 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5717 ts_RIM_Sequence_Number(1),
5718 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5719 ts_RIM_Protocol_Version_Number(1),
5720 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5721 omit);
5722 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5723 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5724 req_cont);
5725
5726
5727 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5728 tr_RIM_Sequence_Number(1),
5729 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5730 tr_RIM_Protocol_Version_Number(1),
5731 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5732 omit);
5733
5734 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5735 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5736 rim_cont_expect);
5737 RIM.send(bssgp_rim_pdu);
5738 T.start;
5739 alt {
5740 [] RIM.receive(bssgp_rim_pdu_expect) { }
5741 [] RIM.receive {
5742 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5743 }
5744 [] T.timeout {
5745 setverdict(fail, "No BSSGP RIM PDU received");
5746 mtc.stop;
5747 }
5748 }
5749
5750 f_shutdown(__BFILE__, __LINE__, final := true);
5751}
5752
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005753control {
5754 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005755 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005756 execute( TC_ta_ptcch_idle() );
5757 execute( TC_ta_rach_imm_ass() );
5758 execute( TC_ta_idle_dl_tbf_ass() );
5759 execute( TC_ta_ptcch_ul_multi_tbf() );
5760 execute( TC_cs_lqual_ul_tbf() );
5761 execute( TC_cs_initial_ul() );
5762 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005763 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005764 execute( TC_cs_max_dl() );
5765 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005766 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005767 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005768 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005769 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005770 execute( TC_t3169() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005771 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02005772 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005773 execute( TC_x2031_t3191() );
5774 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005775 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005776 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005777 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005778 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005779 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005780 execute( TC_mo_ping_pong() );
5781 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005782 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005783 execute( TC_mt_ping_pong() );
5784 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005785 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005786 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005787 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005788 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005789 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005790 execute( TC_paging_cs_from_bts() );
5791 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5792 execute( TC_paging_cs_from_sgsn_sign() );
5793 execute( TC_paging_cs_from_sgsn_ptp() );
5794 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5795 execute( TC_paging_ps_from_sgsn_sign() );
5796 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005797 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5798 execute( TC_paging_cs_multi_ms_imsi() );
5799 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005800 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5801 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005802 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5803 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005804
5805 /* EGPRS specific test cases */
5806 execute( TC_egprs_pkt_chan_req_signalling() );
5807 execute( TC_egprs_pkt_chan_req_one_phase() );
5808 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005809 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005810 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005811 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005812
5813 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005814
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005815 /* Immediate Assignment on AGCH/PCH */
5816 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5817 execute( TC_pcuif_fh_imm_ass_ul() );
5818 execute( TC_pcuif_fh_imm_ass_dl() );
5819 /* Packet Uplink/Downlink Assignment on PACCH */
5820 execute( TC_pcuif_fh_pkt_ass_ul() );
5821 execute( TC_pcuif_fh_pkt_ass_dl() );
5822 execute( TC_multitrx_multims_alloc() );
5823 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5824 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5825 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5826
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005827 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005828
5829 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005830 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005831 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005832 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005833 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005834 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005835 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005836 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005837 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005838 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5839 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005840 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5841 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5842 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005843 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5844 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005845 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5846 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5847 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005848 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005849
5850 execute( TC_rim_ran_info_req_single_rep() );
5851 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005852}
5853
Harald Weltea419df22019-03-21 17:23:04 +01005854}