blob: 4c7fdca95f45d9312e5247d03b92574dc54523dc [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,
Pau Espin Pedrol2aead382020-10-29 20:46:47 +010082 trx := f_PCUIF_ver_INFO_Trxs(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 },
Alexander Couzens1e5dc482020-07-28 15:38:46 +0200112 remote_addr := f_PCUIF_ver_INFO_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 Pedrol84a8c3c2021-03-01 17:22:29 +01001316/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1317 * point the TBF is no longer available. In order to get to start of T3191, we
1318 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1319 * until TBF release procedure starts after draining DL queue. */
1320testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1321 var PCUIF_info_ind info_ind;
1322 var RlcmacDlBlock dl_block;
1323 var octetstring data1 := f_rnd_octstring(200);
1324 var octetstring data2 := f_rnd_octstring(10);
1325 var uint32_t dl_fn;
1326 var template (value) TsTrxBtsNum nr;
1327 var BTS_PDTCH_Block data_msg;
1328 var GprsMS ms;
1329
1330 /* Initialize NS/BSSGP side */
1331 f_init_bssgp();
1332 /* Initialize GPRS MS side */
1333 f_init_gprs_ms();
1334 ms := g_ms[0]; /* We only use first MS in this test */
1335
1336 /* Initialize the PCU interface abstraction */
1337 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1338 /* Set timer to 1 sec (default 5) to speedup test: */
1339 info_ind.t3191 := 1;
1340 f_init_raw(testcasename(), info_ind);
1341
1342 /* Establish BSSGP connection to the PCU */
1343 f_bssgp_establish();
1344 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1345
1346 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1347 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1348 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1349
1350 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1351 f_sleep(X2002);
1352
1353 while (true) {
1354 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1355
1356 /* Keep Ack/Nack description updated (except for last BSN) */
1357 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1358
1359 if (f_dl_block_rrbp_valid(dl_block)) {
1360 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1361 f_dl_block_ack_fn(dl_block, dl_fn));
1362 break;
1363 }
1364 }
1365
1366 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1367 nr := ts_TsTrxBtsNum;
1368 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1369 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1370 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1371 block_nr := nr.blk_nr));
1372 alt {
1373 [] as_ms_rx_ignore_dummy(ms, nr);
1374 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1375 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1376 ?)) -> value data_msg {
1377 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1378 log("Received FINAL_ACK");
1379 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1380 break;
1381 }
1382 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1383 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1384 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1385 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1386 }
1387 nr := ts_TsTrxBtsNum;
1388 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1389 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1390 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1391 block_nr := nr.blk_nr));
1392 repeat;
1393 }
1394 [] BTS.receive {
1395 setverdict(fail, "Unexpected BTS message");
1396 f_shutdown(__BFILE__, __LINE__);
1397 }
1398 }
1399
1400 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1401 to time out. We simply sleep instead of requesting blocks because
1402 otherwise retransmissions would keep restarting the timer. */
1403 f_sleep(int2float(info_ind.t3191));
1404
1405 /* The TBF should be freed now, so new data should trigger an Assignment: */
1406 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1407 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1408
1409 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1410 f_sleep(X2002);
1411 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1412 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1413 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1414 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1415 f_dl_block_ack_fn(dl_block, dl_fn));
1416
1417 f_shutdown(__BFILE__, __LINE__, final := true);
1418}
1419
1420/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1421testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1422 var PCUIF_info_ind info_ind;
1423 var RlcmacDlBlock dl_block;
1424 var octetstring data1 := f_rnd_octstring(1400);
1425 var octetstring data2 := f_rnd_octstring(10);
1426 var uint32_t dl_fn;
1427 var GprsMS ms;
1428
1429 /* Initialize NS/BSSGP side */
1430 f_init_bssgp();
1431 /* Initialize GPRS MS side */
1432 f_init_gprs_ms();
1433 ms := g_ms[0]; /* We only use first MS in this test */
1434
1435 /* Initialize the PCU interface abstraction */
1436 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1437 /* Set timer to 1 sec (default 5) to speedup test: */
1438 info_ind.t3191 := 1;
1439 f_init_raw(testcasename(), info_ind);
1440
1441 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1442
1443 /* Establish BSSGP connection to the PCU */
1444 f_bssgp_establish();
1445 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1446
1447 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1448 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1449 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1450
1451 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1452 f_sleep(X2002);
1453
1454 /* Send enough DL data to at least be able to DL ACK once (excl the
1455 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1456 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1457 while (true) {
1458 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1459
1460 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1461 log("Received FINAL_ACK");
1462 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1463 break;
1464 }
1465
1466 /* Keep Ack/Nack description updated (except for last BSN) */
1467 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1468
1469 if (f_dl_block_rrbp_valid(dl_block)) {
1470 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1471 f_dl_block_ack_fn(dl_block, dl_fn));
1472 }
1473 }
1474
1475 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1476 to time out. We simply sleep instead of requesting blocks because
1477 otherwise retransmissions would keep restarting the timer. */
1478 f_sleep(int2float(info_ind.t3191));
1479
1480 /* The TBF should be freed now, so new data should trigger an Assignment: */
1481 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1482 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1483
1484 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1485 f_sleep(X2002);
1486 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1487 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1488 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1489 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1490 f_dl_block_ack_fn(dl_block, dl_fn));
1491
1492 f_shutdown(__BFILE__, __LINE__, final := true);
1493}
1494
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001495/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1496 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1497 * T3193) after DL TBF release */
1498testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001499 var RlcmacDlBlock dl_block;
1500 var octetstring data := f_rnd_octstring(10);
1501 var boolean ok;
1502 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001503 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001504 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001505 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1506
1507 /* Initialize NS/BSSGP side */
1508 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001509 /* Initialize GPRS MS side */
1510 f_init_gprs_ms();
1511 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001512
1513 /* Initialize the PCU interface abstraction */
1514 f_init_raw(testcasename());
1515
1516 /* Establish BSSGP connection to the PCU */
1517 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001518 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001519
1520 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001521 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1522 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001523
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001524 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1525 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001526 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001527
1528 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001529 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1530 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1531 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001532
1533 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001534 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001535 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001536 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001537 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001538
1539 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001540
1541 /* 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 +07001542 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001543 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1544 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1545 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001546
1547 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001548}
1549
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001550/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1551 freed and no longer available. Trigger it by sending DL blocks and never DL
1552 ACKing the data (which are requested through RRBP) */
1553testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1554 var PCUIF_info_ind info_ind;
1555 var RlcmacDlBlock dl_block;
1556 var octetstring data1 := f_rnd_octstring(1000);
1557 var octetstring data2 := f_rnd_octstring(10);
1558 var uint32_t dl_fn;
1559 var template (value) TsTrxBtsNum nr;
1560 var BTS_PDTCH_Block data_msg;
1561 var GprsMS ms;
1562 const integer N3105_MAX := 2;
1563 var integer N3105 := 0;
1564 timer T_3195 := 1.0;
1565 var integer num_poll_recv := 0;
1566
1567 /* Initialize NS/BSSGP side */
1568 f_init_bssgp();
1569 /* Initialize GPRS MS side */
1570 f_init_gprs_ms();
1571 ms := g_ms[0]; /* We only use first MS in this test */
1572
1573 /* Initialize the PCU interface abstraction */
1574 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1575 /* Speedup test: */
1576 info_ind.n3105 := N3105_MAX;
1577 info_ind.t3195 := 1;
1578 f_init_raw(testcasename(), info_ind);
1579
1580 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1581 * MS and retransmitted after the TBF is released and later on created
1582 * (because the MS is reused) */
1583 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1584
1585 /* Establish BSSGP connection to the PCU */
1586 f_bssgp_establish();
1587 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1588
1589 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1590 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1591 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1592
1593 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1594 f_sleep(X2002);
1595
1596 /* Now we go on receiving DL data and not answering RRBP: */
1597 nr := ts_TsTrxBtsNum;
1598 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1599 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1600 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1601 block_nr := nr.blk_nr));
1602 alt {
1603 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1604 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1605 tr_RLCMAC_DATA)) -> value data_msg {
1606 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1607 if (num_poll_recv == 0) {
1608 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1609 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1610 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1611 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1612 } else {
1613 log("Ignoring RRBP ", num_poll_recv);
1614 N3105 := N3105 + 1;
1615 }
1616 num_poll_recv := num_poll_recv + 1;
1617 }
1618
1619 nr := ts_TsTrxBtsNum;
1620 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1621 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1622 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1623 block_nr := nr.blk_nr));
1624 repeat;
1625 }
1626 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1627 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1628 */
1629 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1630 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1631 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1632 if (not T_3195.running) {
1633 T_3195.start;
1634 /* We even send some new data, nothing should be sent to MS */
1635 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1636 }
1637 nr := ts_TsTrxBtsNum;
1638 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1639 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1640 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1641 block_nr := nr.blk_nr));
1642 repeat;
1643 }
1644 [] T_3195.timeout {
1645 log("T_3195 timeout");
1646 /* Done in alt */
1647 }
1648 [] BTS.receive {
1649 setverdict(fail, "Unexpected BTS message");
1650 f_shutdown(__BFILE__, __LINE__);
1651 }
1652 }
1653
1654 /* after T_3195 timeout, TBF is released */
1655 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
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 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1661
1662 /* ACK the DL block */
1663 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1664 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1665 f_dl_block_ack_fn(dl_block, dl_fn));
1666
1667 f_shutdown(__BFILE__, __LINE__, final := true);
1668}
1669
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001670/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1671testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001672 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001673 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001674 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001675 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001676
1677 /* Initialize NS/BSSGP side */
1678 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001679 /* Initialize GPRS MS side */
1680 f_init_gprs_ms();
1681 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001682
1683 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001684 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001685
1686 /* Establish BSSGP connection to the PCU */
1687 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001688 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001689
1690 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001691 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001692
1693 /* Send one UL block (with TLLI since we are in One-Phase Access
1694 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001695 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001696 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
1697 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001698 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1699 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001700 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001701
1702 /* Send enough blocks to test whole procedure: Until Nth block
1703 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1704 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001705 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001706 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1707 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001708 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001709
1710 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001711 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 +07001712
1713 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001714}
1715
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001716/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1717testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1718 var RlcmacDlBlock dl_block;
1719 var uint32_t dl_fn, sched_fn;
1720 var octetstring payload;
1721 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001722 var template (value) LlcBlockHdr blk_hdr;
1723 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001724 var integer blk_len;
1725 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001726 var GprsMS ms;
1727
1728 /* Initialize NS/BSSGP side */
1729 f_init_bssgp();
1730 /* Initialize GPRS MS side */
1731 f_init_gprs_ms();
1732 ms := g_ms[0]; /* We only use first MS in this test */
1733
1734 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001735 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001736
1737 /* Establish BSSGP connection to the PCU */
1738 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001739 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001740
1741 /* Establish an Uplink TBF */
1742 f_ms_establish_ul_tbf(ms);
1743
1744 /* Send one UL block (with TLLI since we are in One-Phase Access
1745 contention resoultion) and make sure it is ACKED fine. */
1746 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001747 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1748 more := false, e := true);
1749 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001750 /* 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 +01001751 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1752 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001753 cv := 15,
1754 bsn := ms.ul_tbf.bsn,
1755 blocks := blocks,
1756 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001757 f_ultbf_inc_bsn(ms.ul_tbf);
1758 f_ms_tx_ul_block(ms, ul_data);
1759
1760 /* ACK and check it was received fine */
1761 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1762 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1763 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1764 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001765 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 +02001766
1767 /* Test sending LLC PDUS of incrementing size */
1768 var integer max_size := 49;
1769 for (var integer i := 1; i <= max_size; i := i + 1) {
1770 var integer cv;
1771 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1772 log("Sending DATA.ind with LLC payload size ", i);
1773 if (i < max_size - g_bs_cv_max) {
1774 cv := 15;
1775 } else {
1776 cv := max_size - i;
1777 }
1778
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001779 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1780 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001781 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001782 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1783 more := false, e := true);
1784 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001785 /* 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 +01001786 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1787 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001788 cv := cv,
1789 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001790 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001791 f_ultbf_inc_bsn(ms.ul_tbf);
1792 f_ms_tx_ul_block(ms, ul_data);
1793
1794 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001795 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 +02001796
1797 /* we will receive UL ACK/NACK from time to time, handle it. */
1798 f_rx_rlcmac_dl_block(dl_block, dl_fn);
1799 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1800 continue;
1801 }
1802 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
1803 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1804 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1805 f_shutdown(__BFILE__, __LINE__);
1806 }
1807
1808 log("Rx Packet Uplink ACK / NACK");
1809 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
1810 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1811 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1812 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001813
1814 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001815}
1816
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001817function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
1818 var octetstring payload;
1819 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001820 var template (value) LlcBlockHdr blk_hdr;
1821 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001822 var integer block_len, max_valid_data_len;
1823 timer T;
1824
1825 block_len := f_rlcmac_cs_mcs2block_len(cs);
1826 /* We need to send with TLLI since we are in One-Phase Access Contenion
1827 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
1828 * indicator, -1 for spare bits octet at the end */
1829 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
1830 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 +07001831 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1832 more := false, e := true);
1833 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001834 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
1835 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001836 cv := cv,
1837 bsn := ms.ul_tbf.bsn,
1838 blocks := blocks,
1839 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001840 f_ultbf_inc_bsn(ms.ul_tbf);
1841 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
1842
1843 T.start(0.5);
1844 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02001845 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001846 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
1847 f_shutdown(__BFILE__, __LINE__);
1848 }
1849 [] T.timeout {
1850 setverdict(pass);
1851 }
1852 }
1853}
1854/* Verify PCU finds out incorrectly formated RLC block and discards it. This
1855 blocks intentionally contain last byte of data placed in last byte of RLC
1856 containing padding/spare bits, which is incorrect. Spare bits exist and are
1857 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
1858 discounting padding in octet" */
1859testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
1860 var GprsMS ms;
1861 var integer block_len, max_valid_data_len;
1862
1863 /* Initialize NS/BSSGP side */
1864 f_init_bssgp();
1865 /* Initialize GPRS MS side */
1866 f_init_gprs_ms();
1867 ms := g_ms[0]; /* We only use first MS in this test */
1868
1869 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001870 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001871
1872 /* Establish BSSGP connection to the PCU */
1873 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001874 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001875
1876 /* Establish an Uplink TBF */
1877 f_ms_establish_ul_tbf(ms);
1878
1879 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
1880 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
1881 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
1882
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001883 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001884}
1885
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001886/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1887 * answered, so TBFs for uplink and later for downlink are created.
1888 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001889private 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 +02001890 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001891 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001892 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001893 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001894 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001895
1896 /* Initialize NS/BSSGP side */
1897 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001898 /* Initialize GPRS MS side */
1899 f_init_gprs_ms();
1900 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001901
1902 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001903 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001904
1905 /* Establish BSSGP connection to the PCU */
1906 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001907 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001908
1909 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001910 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001911
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001912 /* Send one UL block (with TLLI since we are in One-Phase Access
1913 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001914 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001915 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1916 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001917 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001918
1919 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02001920 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001921
1922 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001923 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1924 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001925
1926 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1927 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001928 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001929
1930 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001931 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1932 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1933 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001934
1935 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001936}
1937
1938/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1939 * answered, so TBFs for uplink and later for downlink are created.
1940 */
1941testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001942 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001943 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001944}
1945
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001946/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1947 * answered, so TBFs for uplink and later for downlink are created.
1948 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001949private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
1950 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02001951 template (present) CodingScheme exp_ul_cs_mcs := ?,
1952 template (present) CodingScheme exp_dl_cs_mcs := ?)
1953runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001954 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001955 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01001956 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001957 var uint32_t sched_fn;
1958 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02001959 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001960 var GprsMS ms;
1961
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001962 /* Initialize NS/BSSGP side */
1963 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001964 /* Initialize GPRS MS side */
1965 f_init_gprs_ms();
1966 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001967
1968 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001969 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001970
1971 /* Establish BSSGP connection to the PCU */
1972 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001973 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001974
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01001975 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
1976 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 +02001977
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001978 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
1979 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 +02001980 f_shutdown(__BFILE__, __LINE__);
1981 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001982
1983 /* Send one UL block (without TLLI since we are in Second-Phase Access)
1984 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01001985 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001986
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001987 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01001988 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 +02001989
1990 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02001991 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001992
1993 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001994 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01001995 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
1996 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001997 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001998 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001999 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002000
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002001 /* PCU acks the UL data after having received CV=0) */
2002 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2003
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002004 /* 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 +02002005 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 +02002006
2007 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002008 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2009 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 +02002010 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002011
2012 f_shutdown(__BFILE__, __LINE__, final := true);
2013}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002014
2015testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002016 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2017 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002018
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002019 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 +02002020}
2021
2022testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002023 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2024 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002025
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002026 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 +02002027}
2028
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002029testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2030 /* Configure PCU to force two phase access */
2031 g_force_two_phase_access := true;
2032
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002033 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002034 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002035
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002036 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 +02002037}
2038
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002039/* Test scenario where SGSN wants to send some data against MS and it is
2040 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2041 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002042private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2043 template (present) CodingScheme exp_cs_mcs := ?)
2044runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002045 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002046 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002047 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002048 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002049 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002050
2051 /* Initialize NS/BSSGP side */
2052 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002053 /* Initialize GPRS MS side */
2054 f_init_gprs_ms();
2055 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002056
2057 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002058 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002059
2060 /* Establish BSSGP connection to the PCU */
2061 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002062 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002063
2064 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002065 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2066 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002067
2068 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2069 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002070 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002071
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002072 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002073 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2074 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 +02002075 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002076
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002077 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002078 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002079
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002080 /* Send one UL block (with TLLI since we are in One-Phase Access
2081 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002082 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002083 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2084 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002085 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002086
2087 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002088 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002089
2090 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002091}
2092
2093testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002094 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002095 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2096}
2097
2098/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2099/* information about the MS */
2100testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002101 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002102 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002103}
2104
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002105/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2106 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2107 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2108 * be transferred).
2109 */
2110testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002111 var RlcmacDlBlock dl_block;
2112 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002113 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002114 var octetstring total_payload;
2115 var octetstring payload;
2116 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002117 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002118 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002119 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002120
2121 /* Initialize NS/BSSGP side */
2122 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002123 /* Initialize GPRS MS side */
2124 f_init_gprs_ms();
2125 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002126
2127 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002128 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002129
2130 /* Establish BSSGP connection to the PCU */
2131 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002132 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002133
2134 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002135 f_ms_establish_ul_tbf(ms);
2136 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002137
2138 /* Send one UL block (with TLLI since we are in One-Phase Access
2139 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002140 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 +02002141 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002142
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002143 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2144 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002145 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002146 total_payload := payload;
2147
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002148 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2149
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002150 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002151 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002152 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002153 total_payload := total_payload & payload;
2154
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002155 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002156 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002157 total_payload := total_payload & payload;
2158
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002159 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002160 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 +02002161 total_payload := total_payload & lost_payload;
2162
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002163 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002164 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002165 total_payload := total_payload & payload;
2166
2167 /* 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 +02002168 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002169
2170 /* On CV=0, we'll receive a UL ACK asking about missing block */
2171 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2172 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002173 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2174 tfi := tfi,
2175 cv := 15,
2176 bsn := 3,
2177 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002178 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002179
2180 /* Now final ack is recieved */
2181 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2182 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002183 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002184
2185 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002186 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 +07002187
2188 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002189}
2190
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002191/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2192 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2193 * timeout occurs (specified by sent RRBP on DL block). */
2194testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002195 var RlcmacDlBlock dl_block;
2196 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002197 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002198 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002199
2200 /* Initialize NS/BSSGP side */
2201 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002202 /* Initialize GPRS MS side */
2203 f_init_gprs_ms();
2204 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002205
2206 /* Initialize the PCU interface abstraction */
2207 f_init_raw(testcasename());
2208
2209 /* Establish BSSGP connection to the PCU */
2210 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002211 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002212
2213 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002214 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2215 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002216
2217 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2218 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002219 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002220
2221 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2222 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2223 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002224 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002225
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002226 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2227 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002228 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002229
2230 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002231 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2232 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2233 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002234
2235 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002236}
2237
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002238/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2239testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2240 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2241 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002242 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002243 var RlcmacDlBlock dl_block;
2244 var uint32_t ack_fn;
2245 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002246 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002247 timer T := 5.0;
2248
2249 /* Initialize NS/BSSGP side */
2250 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002251 /* Initialize GPRS MS side */
2252 f_init_gprs_ms();
2253 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002254
2255 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002256 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002257
Daniel Willmann535aea62020-09-21 13:27:08 +02002258 f_statsd_reset();
2259
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002260 /* Establish BSSGP connection to the PCU */
2261 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002262 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002263
2264 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002265 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2266 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002267
2268 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2269 f_sleep(X2002);
2270
2271 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2272 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002273 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002274
2275 /* TDMA frame number on which we are supposed to send the ACK */
2276 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2277
2278 /* SGSN sends more blocks during the indicated RRBP */
2279 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2280 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002281 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002282
2283 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2284
2285 /* Make sure this block has the same TFI as was assigned
2286 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002287 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002288 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2289 dl_block.data.mac_hdr.hdr_ext.tfi);
2290 f_shutdown(__BFILE__, __LINE__);
2291 }
2292
2293 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002294 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002295
2296 /* Break if this is the end of RRBP */
2297 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002298 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002299 break;
2300 }
2301 }
2302
2303 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002304 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 +07002305
2306 /* Make sure that the next block (after the Ack) is dummy */
2307 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2308
Daniel Willmann535aea62020-09-21 13:27:08 +02002309 var StatsDExpects expect := {
2310 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2311 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2312 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2313 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2314 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002315 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002316 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2317 };
2318 f_statsd_expect(expect);
2319
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002320 f_shutdown(__BFILE__, __LINE__, final := true);
2321}
2322
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002323/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2324 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2325 * Check "3GPP TS 44.060" Annex B. */
2326testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2327 var RlcmacDlBlock dl_block;
2328 var octetstring dataA := f_rnd_octstring(20);
2329 var octetstring dataB := f_rnd_octstring(13);
2330 var octetstring dataC := f_rnd_octstring(3);
2331 var octetstring dataD := f_rnd_octstring(12);
2332 var uint32_t sched_fn;
2333 var GprsMS ms;
2334 var template (value) RlcmacUlBlock ul_data;
2335
2336 /* Initialize NS/BSSGP side */
2337 f_init_bssgp();
2338 /* Initialize GPRS MS side */
2339 f_init_gprs_ms();
2340 ms := g_ms[0]; /* We only use first MS in this test */
2341
2342 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002343 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002344
2345 /* Establish BSSGP connection to the PCU */
2346 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002347 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002348
2349 /* Establish an Uplink TBF */
2350 f_ms_establish_ul_tbf(ms);
2351
2352 /* Summary of what's transmitted:
2353 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2354 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2355 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2356 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2357 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2358 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2359 */
2360
2361 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002362 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2363 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002364 cv := 3,
2365 bsn := ms.ul_tbf.bsn,
2366 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2367 tlli := ms.tlli);
2368 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2369 * RLCMAC block being sent. */
2370 ul_data.data.mac_hdr.e := true;
2371 f_ultbf_inc_bsn(ms.ul_tbf);
2372 f_ms_tx_ul_block(ms, ul_data);
2373
2374 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002375 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2376 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002377 cv := 2,
2378 bsn := ms.ul_tbf.bsn,
2379 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2380 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2381 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2382 },
2383 tlli := ms.tlli);
2384 f_ultbf_inc_bsn(ms.ul_tbf);
2385 f_ms_tx_ul_block(ms, ul_data);
2386
2387 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002388 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 +02002389
2390 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002391 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2392 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002393 cv := 1,
2394 bsn := ms.ul_tbf.bsn,
2395 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2396 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2397 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2398 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2399 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2400 },
2401 tlli := ms.tlli);
2402 f_ultbf_inc_bsn(ms.ul_tbf);
2403 f_ms_tx_ul_block(ms, ul_data);
2404
2405 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002406 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2407 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 +02002408
2409 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002410 ul_data := t_RLCMAC_UL_DATA_TLLI(
2411 cs := CS_1,
2412 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002413 cv := 0,
2414 bsn := ms.ul_tbf.bsn,
2415 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2416 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2417 },
2418 tlli := ms.tlli);
2419 f_ultbf_inc_bsn(ms.ul_tbf);
2420 f_ms_tx_ul_block(ms, ul_data);
2421
2422 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002423 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 +02002424
2425 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2426 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2427 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2428
2429 f_shutdown(__BFILE__, __LINE__, final := true);
2430}
2431
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002432/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2433 * ACK/NACK is not answered */
2434testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2435 var RlcmacDlBlock dl_block;
2436 var octetstring data1 := f_rnd_octstring(200);
2437 var octetstring data2 := f_rnd_octstring(10);
2438 var uint32_t dl_fn;
2439 var GprsMS ms;
2440 var template (value) TsTrxBtsNum nr;
2441 var BTS_PDTCH_Block data_msg;
2442
2443 /* Initialize NS/BSSGP side */
2444 f_init_bssgp();
2445 /* Initialize GPRS MS side */
2446 f_init_gprs_ms();
2447 ms := g_ms[0]; /* We only use first MS in this test */
2448
2449 /* Initialize the PCU interface abstraction */
2450 f_init_raw(testcasename())
2451
2452 /* Establish BSSGP connection to the PCU */
2453 f_bssgp_establish();
2454 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2455
2456 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2457 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2458 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2459
2460 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2461 f_sleep(X2002);
2462
2463 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2464 while (true) {
2465 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2466
2467 /* Keep Ack/Nack description updated (except for last BSN) */
2468 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2469
2470 if (f_dl_block_rrbp_valid(dl_block)) {
2471 /* Don't transmit DL ACK here on purpose ignore it */
2472 break;
2473 }
2474 }
2475
2476 /* PCU starts whole process again */
2477 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2478
2479 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2480 f_sleep(X2002);
2481
2482 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2483 /* DL data), after that we receive only DUMMY blocks so we are done */
2484 var boolean data_received := false;
2485 nr := ts_TsTrxBtsNum;
2486 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2487 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2488 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2489 block_nr := nr.blk_nr));
2490 alt {
2491 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2492 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2493 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2494 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2495 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2496 tr_RLCMAC_DATA)) -> value data_msg {
2497 data_received := true;
2498 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2499 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2500 log("Received FINAL_ACK");
2501 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2502 }
2503 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2504 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2505 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2506 }
2507 nr := ts_TsTrxBtsNum;
2508 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2509 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2510 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2511 block_nr := nr.blk_nr));
2512 repeat;
2513 }
2514 [] BTS.receive {
2515 setverdict(fail, "Unexpected BTS message");
2516 f_shutdown(__BFILE__, __LINE__);
2517 }
2518 }
2519
2520 f_shutdown(__BFILE__, __LINE__, final := true);
2521}
2522
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002523/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2524testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002525 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002526 var octetstring data := f_rnd_octstring(10);
2527 var PacketDlAssign dl_tbf_ass;
2528 var RlcmacDlBlock dl_block;
2529 var uint32_t poll_fn;
2530 var uint32_t sched_fn;
2531 var GprsMS ms;
2532 timer T := 5.0;
2533
2534 /* Initialize NS/BSSGP side */
2535 f_init_bssgp();
2536 /* Initialize GPRS MS side */
2537 f_init_gprs_ms();
2538 ms := g_ms[0]; /* We only use first MS in this test */
2539
2540 /* Only 1 TRX with 8 PDCH */
2541 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11111111'B, 0);
2542 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2543
2544 /* Initialize the PCU interface abstraction */
2545 f_init_raw(testcasename(), info_ind);
2546
2547 /* Establish BSSGP connection to the PCU */
2548 f_bssgp_establish();
2549 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2550
2551 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2552 through PDCH (no multiblock assignment possible through PCH) */
2553 f_ms_establish_ul_tbf(ms);
2554
2555 /* Send one UL block (with TLLI since we are in One-Phase Access
2556 contention resoultion) and make sure it is ACKED fine */
2557 f_ms_tx_ul_data_block(ms, data, with_tlli := true, nr := f_ms_tx_TsTrxBtsNum(ms));
2558 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2559 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2560
2561 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2562 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2563 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2564 gprsextendeddynalloccap := '0'B
2565 };
2566 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2567 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2568 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2569 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2570 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2571 f_shutdown(__BFILE__, __LINE__);
2572 }
2573 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2574
2575 f_shutdown(__BFILE__, __LINE__, final := true);
2576}
2577
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002578testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002579 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002580 var RlcmacDlBlock dl_block;
2581 var octetstring data := f_rnd_octstring(10);
2582 var PollFnCtx pollctx;
2583 var uint32_t sched_fn;
2584 var GprsMS ms;
2585
2586 var MultislotCap_GPRS mscap_gprs := {
2587 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2588 gprsextendeddynalloccap := '0'B
2589 };
2590 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2591
2592
2593 /* Initialize NS/BSSGP side */
2594 f_init_bssgp();
2595 /* Initialize GPRS MS side */
2596 f_init_gprs_ms();
2597 ms := g_ms[0]; /* We only use first MS in this test */
2598
2599 /* Only 1 TRX with 8 PDCH */
2600 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11111111'B, 0);
2601 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2602
2603 /* Initialize the PCU interface abstraction */
2604 f_init_raw(testcasename(), info_ind);
2605
2606 /* Establish BSSGP connection to the PCU */
2607 f_bssgp_establish();
2608 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2609
2610 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2611 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2612
2613 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2614 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2615
2616 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2617 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2618 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2619 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2620 f_shutdown(__BFILE__, __LINE__);
2621 }
2622 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2623
2624 f_shutdown(__BFILE__, __LINE__, final := true);
2625}
2626
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002627testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2628 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2629 var RlcmacDlBlock dl_block;
2630 var octetstring data := f_rnd_octstring(10);
2631 var PollFnCtx pollctx;
2632 var uint32_t sched_fn;
2633 var GprsMS ms;
2634
2635 var MultislotCap_GPRS mscap_gprs := {
2636 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2637 gprsextendeddynalloccap := '0'B
2638 };
2639 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2640
2641
2642 /* Initialize NS/BSSGP side */
2643 f_init_bssgp();
2644 /* Initialize GPRS MS side */
2645 f_init_gprs_ms();
2646 ms := g_ms[0]; /* We only use first MS in this test */
2647
2648 /* Only 1 TRX with 8 PDCH */
2649 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11111111'B, 0);
2650 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2651
2652 /* Initialize the PCU interface abstraction */
2653 f_init_raw(testcasename(), info_ind);
2654
2655 /* Establish BSSGP connection to the PCU */
2656 f_bssgp_establish();
2657 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2658
2659 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2660 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2661
2662 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2663 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2664 f_shutdown(__BFILE__, __LINE__);
2665 }
2666
2667 f_shutdown(__BFILE__, __LINE__, final := true);
2668}
2669
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002670/* Test scenario where MS wants to request a new TBF once the current one is
2671 * ending, by means of sending a Packet Resource Request on ul slot provided by
2672 * last Pkt Ul ACK's RRBP.
2673 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2674testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002675 var RlcmacDlBlock dl_block;
2676 var octetstring data := f_rnd_octstring(10);
2677 var uint32_t sched_fn;
2678 var uint32_t dl_fn;
2679 var template RlcmacDlBlock acknack_tmpl;
2680 var GprsMS ms;
2681
2682 /* Initialize NS/BSSGP side */
2683 f_init_bssgp();
2684 /* Initialize GPRS MS side */
2685 f_init_gprs_ms();
2686 ms := g_ms[0]; /* We only use first MS in this test */
2687
2688 /* Initialize the PCU interface abstraction */
2689 f_init_raw(testcasename());
2690
2691 /* Establish BSSGP connection to the PCU */
2692 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002693 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002694
2695 /* Establish an Uplink TBF */
2696 f_ms_establish_ul_tbf(ms);
2697
2698 /* Send one UL block (with TLLI since we are in One-Phase Access
2699 contention resoultion) and make sure it is ACKED fine */
2700 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2701
2702 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002703 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002704
2705 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2706 tr_UlAckNackGprs(ms.tlli,
2707 tr_AckNackDescription(final_ack := '1'B),
2708 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2709 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2710
2711 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2712
2713 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002714 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 +07002715 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002716 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2717 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2718
2719 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2720 and make sure it is ACKED fine */
2721 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2722
2723 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002724 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002725
2726 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2727 /* ACK the ACK */
2728 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2729
2730 f_shutdown(__BFILE__, __LINE__, final := true);
2731}
2732
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002733/* Test CS paging over the BTS<->PCU socket.
2734 * 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.
2735 * Paging should be send on the PACCH.
2736 *
2737 * 1. Send a Paging Request over PCU socket.
2738 * 2. Send a Ready-To-Send message over PCU socket
2739 * 3. Expect a Paging Frame
2740 */
2741testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002742 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002743 var MobileIdentityLV mi;
2744 var octetstring mi_enc_lv;
2745 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002746 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002747
2748 /* Initialize NS/BSSGP side */
2749 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002750 /* Initialize GPRS MS side */
2751 f_init_gprs_ms();
2752 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002753
2754 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002755 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002756
2757 /* Establish BSSGP connection to the PCU */
2758 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002759 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002760
2761 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002762 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002763
2764 /* build mobile Identity */
2765 mi := valueof(ts_MI_IMSI_LV(imsi));
2766 mi_enc_lv := enc_MobileIdentityLV(mi);
2767 /* Send paging request */
2768 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2769 sapi :=PCU_IF_SAPI_PDTCH));
2770
2771 /* Receive it on BTS side towards MS */
2772 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2773
2774 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002775 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2776 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2777 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2778 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002779
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002780 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002781}
2782
2783/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2784 */
2785private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2786runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002787 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002788 var hexstring imsi := f_gen_imsi(42);
2789 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002790 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002791
2792 /* Initialize NS/BSSGP side */
2793 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002794 /* Initialize GPRS MS side */
2795 f_init_gprs_ms();
2796 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002797
2798 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002799 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002800
2801 /* Establish BSSGP connection to the PCU */
2802 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002803 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002804
2805 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002806 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002807
2808 /* Send paging request with or without TMSI */
2809 if (use_ptmsi) {
2810 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
2811 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
2812 } else {
2813 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
2814 }
2815
2816 /* Receive it on BTS side towards MS */
2817 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2818
2819 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002820 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002821 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002822 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
2823 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
2824 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002825 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002826 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2827 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2828 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002829 }
2830
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002831 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002832}
2833
2834testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2835 f_tc_paging_cs_from_sgsn(0, true);
2836}
2837
2838testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2839 f_tc_paging_cs_from_sgsn(0);
2840}
2841
2842testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002843 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002844}
2845
2846/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
2847 */
2848private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2849runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002850 var integer imsi_suff_tx := 423;
2851 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002852 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002853
2854 /* Initialize NS/BSSGP side */
2855 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002856 /* Initialize GPRS MS side */
2857 f_init_gprs_ms();
2858 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002859
2860 /* Initialize the PCU interface abstraction */
2861 f_init_raw(testcasename());
2862
2863 /* Establish BSSGP connection to the PCU */
2864 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002865 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002866
2867 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
2868 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
2869 if (use_ptmsi) {
2870 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
2871 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
2872 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
2873 } else {
2874 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
2875 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
2876 }
2877
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002878 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002879}
2880
2881testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2882 f_tc_paging_ps_from_sgsn(0, true);
2883}
2884
2885testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2886 f_tc_paging_ps_from_sgsn(0);
2887}
2888
2889testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002890 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002891}
2892
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002893/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
2894testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
2895 var RlcmacDlBlock dl_block;
2896 var octetstring data := f_rnd_octstring(10);
2897 var uint32_t sched_fn;
2898 var uint32_t dl_fn;
2899 var GprsMS ms;
2900
2901 /* Initialize NS/BSSGP side */
2902 f_init_bssgp();
2903 /* Initialize GPRS MS side */
2904 f_init_gprs_ms();
2905 ms := g_ms[0]; /* We only use first MS in this test */
2906
2907 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002908 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002909
Daniel Willmann535aea62020-09-21 13:27:08 +02002910 f_statsd_reset();
2911
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002912 /* Establish BSSGP connection to the PCU */
2913 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002914 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002915
2916 /* Establish an Uplink TBF */
2917 f_ms_establish_ul_tbf(ms);
2918
2919 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
2920 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2921 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2922 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2923 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2924
2925 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002926 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002927
2928 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
2929 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
2930 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2931
2932 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2933 f_sleep(X2002);
2934 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
2935
2936 /* ACK the DL block */
2937 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2938 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2939 f_dl_block_ack_fn(dl_block, dl_fn));
2940
Daniel Willmann535aea62020-09-21 13:27:08 +02002941 var StatsDExpects expect := {
2942 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
2943 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2944 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2945 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002946 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01002947 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02002948 };
2949 f_statsd_expect(expect);
2950
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002951 f_shutdown(__BFILE__, __LINE__, final := true);
2952}
2953
2954/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
2955testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
2956 var RlcmacDlBlock dl_block;
2957 var octetstring data := f_rnd_octstring(10);
2958 var uint32_t sched_fn;
2959 var uint32_t dl_fn;
2960 var GprsMS ms;
2961
2962 /* Initialize NS/BSSGP side */
2963 f_init_bssgp();
2964 /* Initialize GPRS MS side */
2965 f_init_gprs_ms();
2966 ms := g_ms[0]; /* We only use first MS in this test */
2967
2968 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002969 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002970
2971 /* Establish BSSGP connection to the PCU */
2972 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002973 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002974
2975 /* Establish an Uplink TBF */
2976 f_ms_establish_ul_tbf(ms);
2977
2978 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
2979 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2980 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2981 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2982 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2983
2984 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002985 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002986
2987 /* Now SGSN sends some DL data with an invalid IMSI */
2988 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
2989
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01002990 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002991
2992 /* TODO: make sure no data is sent over PCU -> MS */
2993
2994 f_shutdown(__BFILE__, __LINE__, final := true);
2995}
2996
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01002997private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
2998 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2999 var octetstring data := f_rnd_octstring(6);
3000 var RlcmacDlBlock dl_block;
3001 var GprsMS ms;
3002 var uint32_t fn;
3003
3004 /* Initialize NS/BSSGP side */
3005 f_init_bssgp();
3006 /* Initialize GPRS MS side */
3007 f_init_gprs_ms();
3008 ms := g_ms[0]; /* We only use first MS in this test */
3009
3010 /* Initialize the PCU interface abstraction */
3011 f_init_raw(testcasename());
3012
3013 /* Establish BSSGP connection to the PCU */
3014 f_bssgp_establish();
3015 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3016
3017 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3018 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3019 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3020
3021 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3022 f_sleep(X2002);
3023
3024 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3025 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3026
3027 if (ischosen(dl_block.data_egprs)) {
3028 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3029 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3030 f_shutdown(__BFILE__, __LINE__);
3031 }
3032 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3033 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3034 f_shutdown(__BFILE__, __LINE__);
3035 }
3036 if (not match(dl_block.data_egprs.blocks[1].payload,
3037 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3038 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3039 f_shutdown(__BFILE__, __LINE__);
3040 }
3041 } else if (lengthof(dl_block.data.blocks) > 1) {
3042 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3043 f_shutdown(__BFILE__, __LINE__);
3044 }
3045
3046 f_shutdown(__BFILE__, __LINE__, final := true);
3047}
3048
3049/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3050 * containing llc data. See OS#4849 */
3051testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3052 f_tc_dl_data_no_llc_ui_dummy(omit);
3053}
3054
3055/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3056 * containing llc data. See OS#4849 */
3057testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003058 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003059}
3060
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003061private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003062 template GsmRrMessage t_imm_ass := ?,
3063 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003064runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003065 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003066 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003067
3068 ra11 := enc_EGPRSPktChRequest2uint(req);
3069 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3070
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003071 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003072 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003073 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003074 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003075 }
3076
3077 setverdict(pass);
3078}
3079
3080testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3081 var template GsmRrMessage imm_ass;
3082 var template IaRestOctets rest;
3083 var template EgprsUlAss ul_ass;
3084
3085 /* Initialize the PCU interface abstraction */
3086 f_init_raw(testcasename());
3087
3088 var EGPRSPktChRequest req := {
3089 /* NOTE: other fields are set in the loop */
3090 signalling := { tag := '110011'B }
3091 };
3092
3093 for (var integer i := 0; i < 6; i := i + 1) {
3094 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3095 req.signalling.random_bits := ext_ra;
3096
3097 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3098 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3099 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3100 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3101
3102 f_TC_egprs_pkt_chan_req(req, imm_ass);
3103 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003104
3105 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003106}
3107
3108testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3109 var template GsmRrMessage imm_ass;
3110 var template IaRestOctets rest;
3111 var template EgprsUlAss ul_ass;
3112
3113 /* Initialize the PCU interface abstraction */
3114 f_init_raw(testcasename());
3115
3116 var EGPRSPktChRequest req := {
3117 /* NOTE: other fields are set in the loop */
3118 one_phase := { tag := '0'B }
3119 };
3120
3121 for (var integer i := 0; i < 6; i := i + 1) {
3122 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3123 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3124 var BIT2 priority := substr(ext_ra, 0, 2);
3125 var BIT3 rand := substr(ext_ra, 2, 3);
3126
3127 req.one_phase.multislot_class := mslot_class;
3128 req.one_phase.priority := priority;
3129 req.one_phase.random_bits := rand;
3130
3131 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3132 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3133 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3134 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3135
3136 f_TC_egprs_pkt_chan_req(req, imm_ass);
3137 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003138
3139 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003140}
3141
3142testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3143 var template GsmRrMessage imm_ass;
3144 var template IaRestOctets rest;
3145 var template EgprsUlAss ul_ass;
3146
3147 /* Initialize the PCU interface abstraction */
3148 f_init_raw(testcasename());
3149
3150 var EGPRSPktChRequest req := {
3151 /* NOTE: other fields are set in the loop */
3152 two_phase := { tag := '110000'B }
3153 };
3154
3155 for (var integer i := 0; i < 6; i := i + 1) {
3156 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3157 var BIT2 priority := substr(ext_ra, 0, 2);
3158 var BIT3 rand := substr(ext_ra, 2, 3);
3159
3160 req.two_phase.priority := priority;
3161 req.two_phase.random_bits := rand;
3162
3163 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3164 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3165 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3166 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3167
3168 f_TC_egprs_pkt_chan_req(req, imm_ass);
3169 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003170
3171 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003172}
3173
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003174private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3175 template IARRestOctets rest := ?,
3176 PCUIF_BurstType bt := BURST_TYPE_1)
3177runs on RAW_PCU_Test_CT {
3178 var template ReqRefWaitInd tr_ref;
3179 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003180
3181 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3182 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3183 ra := bit2int(ra11), is_11bit := 1,
3184 burst_type := bt, fn := fn,
3185 arfcn := 871));
3186
3187 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003188 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003189
3190 /* Just to have a short-name reference to the actual message */
3191 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3192
3193 /* Make sure that Request Reference list contains at least one entry
3194 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3195 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3196 if (not match(iar.payload, { *, tr_ref, * })) {
3197 setverdict(fail, "Request Reference list does not match");
3198 f_shutdown(__BFILE__, __LINE__);
3199 }
3200
3201 /* Match Feature Indicator (must indicate PS domain) */
3202 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3203 setverdict(fail, "Feature Indicator does not match");
3204 f_shutdown(__BFILE__, __LINE__);
3205 }
3206
3207 /* Match IAR Rest Octets */
3208 if (not match(iar.rest_octets, rest)) {
3209 setverdict(fail, "IAR Rest Octets does not match: ",
3210 iar.rest_octets, " vs expected ", rest);
3211 f_shutdown(__BFILE__, __LINE__);
3212 }
3213
3214 setverdict(pass);
3215}
3216
3217/* Verify the contents of RR Immediate Assignment Reject message and its
3218 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3219testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3220 var template IARRestOctets rest;
3221 var BIT5 ext_ra;
3222
3223 /* Initialize the PCU interface abstraction */
3224 f_init_raw(testcasename());
3225
3226 for (var integer i := 0; i < 6; i := i + 1) {
3227 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3228 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3229
3230 /* Intentionally incorrect message (see table 11.2.5a.2) */
3231 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3232 }
3233
3234 f_shutdown(__BFILE__, __LINE__, final := true);
3235}
3236
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003237/* At the moment, the IUT does not support any emergency services. Make sure
3238 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3239testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3240 var template IARRestOctets rest;
3241 var BIT5 ext_ra;
3242 var BIT11 ra11;
3243
3244 /* Initialize the PCU interface abstraction */
3245 f_init_raw(testcasename());
3246
3247 var EGPRSPktChRequest req := {
3248 /* NOTE: other fields are set in the loop */
3249 emergency := { tag := '110111'B }
3250 };
3251
3252 for (var integer i := 0; i < 6; i := i + 1) {
3253 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3254 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3255
3256 req.emergency.random_bits := ext_ra;
3257 ra11 := enc_EGPRSPktChRequest2bits(req);
3258
3259 /* Intentionally incorrect message (see table 11.2.5a.2) */
3260 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3261 }
3262
3263 f_shutdown(__BFILE__, __LINE__, final := true);
3264}
3265
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003266/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3267testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003268 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003269 var template IARRestOctets rest;
3270 var BIT11 ra11;
3271
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003272 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003273
3274 /* Only the first TRX is enabled. */
3275 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3276 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003277
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003278 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003279 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003280
3281 var EGPRSPktChRequest req := {
3282 one_phase := {
3283 tag := '0'B,
3284 multislot_class := '10101'B,
3285 priority := '01'B,
3286 random_bits := '101'B
3287 }
3288 };
3289
3290 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3291 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3292 for (var integer i := 0; i < 7; i := i + 1) {
3293 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3294 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3295 }
3296
3297 ra11 := enc_EGPRSPktChRequest2bits(req);
3298 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3299
3300 /* At this point, the IUT should run out of free USFs */
3301 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3302
3303 f_shutdown(__BFILE__, __LINE__, final := true);
3304}
3305
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003306/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003307private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003308return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003309 /* Pick a random MA length in range 2 .. max_ma_len */
3310 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3311
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003312 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3313 hsn := f_rnd_int(63),
3314 maio := f_rnd_int(63),
3315 ma := f_rnd_bitstring(ma_len));
3316}
3317
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003318private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3319 in GsmRrMessage rr_msg)
3320{
3321 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
3322 var PCUIF_InfoTrxTs ts := info_ind.trx.v10[0].ts[ia.pkt_chan_desc.tn];
3323
3324 var template PacketChannelDescription tr_pkt_chan_desc := {
3325 channel_Type_spare := ?,
3326 tn := ?,
3327 tsc := ts.tsc,
3328 presence := '1'B,
3329 zero := omit,
3330 one := {
3331 maio := ts.maio,
3332 hsn := ts.hsn
3333 }
3334 };
3335
3336 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3337 setverdict(fail, "Packet Channel Description does not match: ",
3338 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3339 }
3340
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003341 /* Mobile Allocation is expected to be octet-aligned */
3342 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3343 var template MobileAllocationLV tr_ma := {
3344 len := ma_oct_len, /* in bytes */
3345 ma := substr(ts.ma, 0, ma_oct_len * 8)
3346 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003347
3348 if (not match(ia.mobile_allocation, tr_ma)) {
3349 setverdict(fail, "Mobile Allocation does not match: ",
3350 ia.mobile_allocation, " vs ", tr_ma);
3351 }
3352
3353 setverdict(pass);
3354}
3355
3356/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3357testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003358 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003359 var GprsMS ms := valueof(t_GprsMS_def);
3360
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003361 /* Enable frequency hopping on TRX0/TS7 */
3362 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003363
3364 /* Initialize the PCU interface abstraction */
3365 f_init_raw(testcasename(), info_ind);
3366
3367 /* EGPRS Packet Channel Request (cause=Signalling) */
3368 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3369
3370 /* Establish an Uplink EGPRS TBF */
3371 f_ms_establish_ul_tbf(ms);
3372
3373 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3374 f_shutdown(__BFILE__, __LINE__, final := true);
3375}
3376
3377/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3378testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003379 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003380 var GprsMS ms := valueof(t_GprsMS_def);
3381
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003382 /* Enable frequency hopping on TRX0/TS7 */
3383 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003384
3385 /* Initialize the PCU interface abstraction */
3386 f_init_raw(testcasename(), info_ind);
3387
3388 /* Establish an Uplink TBF */
3389 f_ms_establish_ul_tbf(ms);
3390
3391 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3392 f_shutdown(__BFILE__, __LINE__, final := true);
3393}
3394
3395/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3396testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003397 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003398 var GprsMS ms := valueof(t_GprsMS_def);
3399
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003400 /* Enable frequency hopping on TRX0/TS7 */
3401 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003402
3403 /* Initialize NS/BSSGP side */
3404 f_init_bssgp();
3405
3406 /* Initialize the PCU interface abstraction */
3407 f_init_raw(testcasename(), info_ind);
3408
3409 /* Establish BSSGP connection to the PCU */
3410 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003411 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003412
3413 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3414 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3415 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3416
3417 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3418 f_shutdown(__BFILE__, __LINE__, final := true);
3419}
3420
3421private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3422 in FrequencyParameters fp)
3423{
3424 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
3425 var PCUIF_InfoTrxTs ts := info_ind.trx.v10[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003426
3427 /* Table 12.8.1: Frequency Parameters information elements */
3428 var template FrequencyParameters tr_fp := {
3429 tsc := ts.tsc,
3430 presence := '10'B, /* Direct encoding 1 */
3431 arfcn := omit,
3432 indirect := omit,
3433 direct1 := {
3434 maio := ts.maio,
3435 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3436 mobile_allocation := {
3437 hsn := ts.hsn,
3438 rfl_number_list_present := '0'B,
3439 rfl_number_list := omit,
3440 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003441 ma_length := ts.ma_bit_len,
3442 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003443 }
3444 },
3445 direct2 := omit
3446 };
3447
3448 if (not match(fp, tr_fp)) {
3449 setverdict(fail, "Frequency Parameters IE does not match: ",
3450 fp, " vs ", tr_fp);
3451 }
3452
3453 setverdict(pass);
3454}
3455
3456/* Make sure that Packet Uplink Assignment contains hopping parameters */
3457testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003458 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003459 var GprsMS ms := valueof(t_GprsMS_def);
3460 var uint32_t poll_fn;
3461
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003462 /* Enable frequency hopping on TRX0/TS7 */
3463 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003464
3465 /* Initialize the PCU interface abstraction */
3466 f_init_raw(testcasename(), info_ind);
3467
3468 /* Establish an Uplink TBF */
3469 f_ms_establish_ul_tbf(ms);
3470
3471 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
3472 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)));
3473
3474 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003475 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3476 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003477
3478 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3479 var template (omit) FrequencyParameters fp;
3480 if (ua.is_egprs == '1'B) {
3481 fp := ua.egprs.freq_par;
3482 } else {
3483 fp := ua.gprs.freq_par;
3484 }
3485
3486 /* This is an optional IE, so it's worth to check its presence */
3487 if (istemplatekind(fp, "omit")) {
3488 setverdict(fail, "Frequency Parameters IE is not present");
3489 f_shutdown(__BFILE__, __LINE__);
3490 }
3491
3492 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3493 f_shutdown(__BFILE__, __LINE__, final := true);
3494}
3495
3496/* Make sure that Packet Downlink Assignment contains hopping parameters */
3497testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003498 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003499 var octetstring data := f_rnd_octstring(10);
3500 var GprsMS ms := valueof(t_GprsMS_def);
3501 var RlcmacDlBlock dl_block;
3502 var uint32_t poll_fn;
3503
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003504 /* Enable frequency hopping on TRX0/TS7 */
3505 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003506
3507 /* Initialize NS/BSSGP side */
3508 f_init_bssgp();
3509
3510 /* Initialize the PCU interface abstraction */
3511 f_init_raw(testcasename(), info_ind);
3512
3513 /* Establish BSSGP connection to the PCU */
3514 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003515 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003516
3517 /* Establish an Uplink TBF */
3518 f_ms_establish_ul_tbf(ms);
3519
3520 /* Send an Uplink block, so this TBF becomes "active" */
3521 f_ms_tx_ul_data_block(ms, data, with_tlli := true);
3522
3523 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3524 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3525 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3526
3527 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3528 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3529
3530 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003531 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3532 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003533
3534 /* This is an optional IE, so it's worth to check its presence */
3535 if (not ispresent(da.freq_par)) {
3536 setverdict(fail, "Frequency Parameters IE is not present");
3537 f_shutdown(__BFILE__, __LINE__);
3538 }
3539
3540 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3541 f_shutdown(__BFILE__, __LINE__, final := true);
3542}
3543
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003544/* Check if the IUT handles subsequent INFO.ind messages */
3545testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003546 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003547 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003548
3549 /* Initialize the PCU interface abstraction */
3550 f_init_raw(testcasename(), info_ind);
3551
3552 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3553 for (var integer i := 0; i < 16; i := i + 1) {
3554 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003555 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003556 }
3557
3558 f_shutdown(__BFILE__, __LINE__, final := true);
3559}
3560
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003561/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3562testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3563 var PCUIF_info_ind info_ind;
3564 var integer i;
3565 const integer num_ms := 8;
3566
3567 /* Initialize NS/BSSGP side */
3568 f_init_bssgp();
3569 /* Initialize GPRS MS side */
3570 f_init_gprs_ms(num_ms);
3571
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003572 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003573 /* Only the 3 first TRX are enabled. The enabled ones all have same
3574 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003575 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3576 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000011'B, 0);
3577 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00001100'B, 1);
3578 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003579
3580 /* Initialize the PCU interface abstraction */
3581 f_init_raw(testcasename(), info_ind);
3582
3583 /* Establish BSSGP connection to the PCU */
3584 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003585 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003586
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003587 /* Establish an Uplink TBF for each GprsMS instance */
3588 f_multi_ms_establish_tbf(do_activate := false);
3589
3590 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003591 for (i := 0; i < num_ms; i := i + 1) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003592 if (g_ms[i].ul_tbf.arfcn != info_ind.trx.v10[i mod 3].arfcn) {
3593 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
3594 " vs exp ", info_ind.trx.v10[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003595 f_shutdown(__BFILE__, __LINE__);
3596 }
3597 }
3598
3599 f_shutdown(__BFILE__, __LINE__, final := true);
3600}
3601
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003602/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3603 * downgraded to CS1-4 so that GPRS can read the USF).
3604 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3605 */
3606testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3607 var PCUIF_info_ind info_ind;
3608 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3609 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003610 var uint32_t sched_fn, dl_fn, ack_fn;
3611 var octetstring data := f_rnd_octstring(10);
3612 var RlcmacDlBlock dl_block;
3613 var integer tx_data_remain := 5;
3614 var integer tgt_ms;
3615 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3616 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3617
3618 /* Initialize NS/BSSGP side */
3619 f_init_bssgp();
3620 /* Initialize GPRS MS side */
3621 f_init_gprs_ms(num_ms);
3622
3623 info_ind := valueof(ts_PCUIF_INFO_default);
3624 /* Only use 1 PDCH to make sure both end up in the same slot: */
3625 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000001'B, 0);
3626 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3627
3628 /* Initialize the PCU interface abstraction */
3629 f_init_raw(testcasename(), info_ind);
3630
3631 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3632 g_mcs_initial_dl := 5;
3633 g_mcs_max_dl := 5;
3634 f_pcuvty_set_allowed_cs_mcs();
3635
3636 /* Establish BSSGP connection to the PCU */
3637 f_bssgp_establish();
3638 f_multi_ms_bssgp_register();
3639
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003640 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003641 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 +01003642 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3643 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3644 f_shutdown(__BFILE__, __LINE__);
3645 }
3646 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3647 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3648
3649 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003650 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 +01003651 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3652 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3653 f_shutdown(__BFILE__, __LINE__);
3654 }
3655 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3656 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3657
3658 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3659 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3660 f_sleep(0.1);
3661 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3662 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3663 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3664 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3665 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3666 /* ACK the DL block */
3667 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3668 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3669 f_dl_block_ack_fn(dl_block, dl_fn));
3670
3671 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3672 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3673 f_sleep(0.1);
3674 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3675 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3676 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3677 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3678 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3679 /* ACK the DL block */
3680 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3681 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3682 f_dl_block_ack_fn(dl_block, dl_fn));
3683
3684 data := f_rnd_octstring(1400);
3685 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3686 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3687
3688 for (var integer i := 0; i < 800; i := i + 1) {
3689 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3690
3691 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3692 /* No more data to receive, done */
3693 break;
3694 }
3695
3696 if (ischosen(dl_block.ctrl)) {
3697 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3698 f_shutdown(__BFILE__, __LINE__);
3699 } else if (ischosen(dl_block.data_egprs)) {
3700 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3701 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3702 f_shutdown(__BFILE__, __LINE__);
3703 }
3704 tgt_ms := 1;
3705 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3706 if (dl_block.data_egprs.mcs > MCS_4) {
3707 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3708 f_shutdown(__BFILE__, __LINE__);
3709 }
3710 ms_egprs_usf_count[0] := ms_egprs_usf_count[0] + 1;
3711 } else {
3712 if (dl_block.data_egprs.mcs <= MCS_4) {
3713 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3714 f_shutdown(__BFILE__, __LINE__);
3715 }
3716 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
3717 ms_egprs_usf_count[1] := ms_egprs_usf_count[1] + 1;
3718 }
3719 }
3720 } else {
3721 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3722 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3723 f_shutdown(__BFILE__, __LINE__);
3724 }
3725 tgt_ms := 0;
3726 if (match(dl_block.data.mac_hdr.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3727 ms_gprs_usf_count[0] := ms_gprs_usf_count[0] + 1;
3728 } else if (match(dl_block.data.mac_hdr.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
3729 ms_gprs_usf_count[1] := ms_gprs_usf_count[1] + 1;
3730 }
3731 }
3732
3733 /* Keep Ack/Nack description updated */
3734 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3735
3736 /* TDMA frame number on which we are supposed to send the ACK */
3737 if (f_dl_block_rrbp_valid(dl_block)) {
3738 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3739 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);
3740 if (tx_data_remain != 0) {
3741 /* Submit more data from time to time to keep the TBF ongoing */
3742 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3743 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3744 tx_data_remain := tx_data_remain - 1;
3745 }
3746 }
3747 }
3748
3749 log("results: ms_gprs_usf_count=", ms_gprs_usf_count, " / ms_egprs_usf_count=", ms_egprs_usf_count);
3750 if (ms_gprs_usf_count[0] == 0 or ms_gprs_usf_count[1] == 0 or
3751 ms_egprs_usf_count[0] == 0 or ms_egprs_usf_count[1] == 0) {
3752 setverdict(fail, "USF thresholds not met!");
3753 f_shutdown(__BFILE__, __LINE__);
3754 }
3755
3756 f_shutdown(__BFILE__, __LINE__, final := true);
3757}
3758
3759
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003760private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3761 boolean exp_imsi, boolean exp_tmsi)
3762runs on RAW_PCU_Test_CT {
3763 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
3764 var integer pending := lengthof(g_ms);
3765 var RlcmacDlBlock dl_block;
3766 var boolean f1, f2;
3767
3768 while (pending > 0) {
3769 var uint32_t poll_fn;
3770
3771 /* Obtain a Downlink block and make sure it is a paging request */
3772 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
3773 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
3774 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3775 break;
3776 }
3777
3778 /* This should not happen in general, but who knows... */
3779 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3780 if (not ispresent(req.repeated_pageinfo)) {
3781 setverdict(fail, "Repeated Page Info IE is absent?!?");
3782 break;
3783 }
3784
3785 /* A single message may contain several MIs depending on their type */
3786 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3787 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
3788 ps_domain := false);
3789 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
3790 ps_domain := false);
3791 if (not f1 and not f2)
3792 { continue; }
3793
3794 /* Detect duplicate MIs */
3795 if (mask[i] == '1'B) {
3796 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
3797 continue;
3798 }
3799
3800 mask[i] := '1'B;
3801 }
3802
3803 pending := pending - lengthof(req.repeated_pageinfo);
3804 }
3805
3806 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
3807 if (mask[i] != '1'B) {
3808 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
3809 log("===== mask := ", mask);
3810 }
3811 }
3812
3813 /* All messages must have been received by now, expect a dummy block */
3814 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
3815}
3816
3817private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
3818runs on RAW_PCU_Test_CT {
3819 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3820 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3821
3822 /* Initialize NS/BSSGP side */
3823 f_init_bssgp();
3824
3825 /* Explicitly set the given PDCH slot-mask to all transceivers */
3826 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, pdch_mask);
3827
3828 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
3829 f_init_gprs_ms(7 * 8);
3830
3831 /* Initialize the PCU interface abstraction */
3832 f_init_raw(testcasename(), info_ind);
3833
3834 /* Establish BSSGP connection to the PCU */
3835 f_bssgp_establish();
3836 f_multi_ms_bssgp_register();
3837
3838 /* Establish an Uplink TBF for each GprsMS instance */
3839 f_multi_ms_establish_tbf(do_activate := true);
3840}
3841
3842testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
3843 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3844
3845 /* Common part: send INFO.ind, establish TBFs... */
3846 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3847
3848 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
3849 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3850 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3851 }
3852
3853 /* FIXME: work around a race condition between PCUIF and BSSGP */
3854 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3855
3856 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3857 * The IUT is expected to page on all PDCH slots of all transceivers. */
3858 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3859 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3860 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
3861 }
3862
3863 f_shutdown(__BFILE__, __LINE__, final := true);
3864}
3865
3866testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
3867 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3868
3869 /* Common part: send INFO.ind, establish TBFs... */
3870 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3871
3872 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
3873 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3874 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
3875 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
3876 }
3877
3878 /* FIXME: work around a race condition between PCUIF and BSSGP */
3879 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3880
3881 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3882 * The IUT is expected to page on all PDCH slots of all transceivers. */
3883 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3884 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3885 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
3886 }
3887
3888 f_shutdown(__BFILE__, __LINE__, final := true);
3889}
3890
3891testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
3892 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3893
3894 /* Common part: send INFO.ind, establish TBFs... */
3895 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3896
3897 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
3898 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3899 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
3900 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
3901 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
3902 } else {
3903 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3904 }
3905 }
3906
3907 /* FIXME: work around a race condition between PCUIF and BSSGP */
3908 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3909
3910 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3911 * The IUT is expected to page on all PDCH slots of all transceivers. */
3912 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3913 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3914 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
3915 }
3916
3917 f_shutdown(__BFILE__, __LINE__, final := true);
3918}
3919
Pau Espin Pedrola846e612021-02-01 19:25:25 +01003920private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003921runs on RAW_PCU_Test_CT return RlcmacDlBlock {
3922 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003923 var integer i := 0;
3924 while (true) {
3925 f_rx_rlcmac_dl_block(dl_block, sched_fn);
3926 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
3927 break;
3928 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01003929 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003930 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3931 f_shutdown(__BFILE__, __LINE__);
3932 }
3933 i := i + 1;
3934 }
3935 return dl_block;
3936}
3937
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01003938private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
3939runs on RAW_PCU_Test_CT {
3940 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),
3941 info_ind.lac),
3942 info_ind.rac),
3943 info_ind.cell_id));
3944 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
3945 423),
3946 2),
3947 5));
3948 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
3949 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
3950 var template (value) RAN_Information_RIM_Container res_cont :=
3951 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3952 ts_RIM_Sequence_Number(2),
3953 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3954 ts_RIM_Protocol_Version_Number(1),
3955 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
3956 omit);
3957 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3958 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3959 res_cont));
3960}
3961
3962altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
3963runs on RAW_PCU_Test_CT {
3964 /* RIM procedure: */
3965 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),
3966 info_ind.lac),
3967 info_ind.rac),
3968 info_ind.cell_id));
3969 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
3970 423),
3971 2),
3972 5));
3973 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
3974 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
3975 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3976 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3977 tr_RAN_Information_Request_RIM_Container)) {
3978 if (do_answer) {
3979 f_outbound_nacc_rim_tx_resp(info_ind);
3980 }
3981 if (do_repeat) {
3982 repeat;
3983 }
3984 }
3985}
3986
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003987/* Start NACC from MS side */
3988private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01003989 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
3990 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003991runs on RAW_PCU_Test_CT {
3992 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
3993 var RlcmacDlBlock dl_block;
3994 var uint32_t sched_fn;
3995 var GsmArfcn req_arfcn := 862;
3996 var uint6_t req_bsic := 43;
3997
3998 /* Start NACC from MS side */
3999 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4000 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4001
4002 if (exp_rac_ci_query == true) {
4003 /* osmo-pcu should now ask for resolution: */
4004 f_ipa_ctrl_wait_link_up();
4005 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4006 int2str(info_ind.lac) & "." &
4007 int2str(info_ind.cell_id) & "." &
4008 int2str(req_arfcn) & "." &
4009 int2str(req_bsic);
4010 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4011 }
4012
4013 if (exp_si_query == true) {
4014 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004015 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004016 }
4017
4018 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004019 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004020
4021 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4022 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4023 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4024 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4025 f_shutdown(__BFILE__, __LINE__);
4026 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004027 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004028 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004029 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4030 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4031 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004032}
4033
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004034/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4035testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004036 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004037 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004038 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004039
4040 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4041 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4042
4043 /* Initialize NS/BSSGP side */
4044 f_init_bssgp();
4045 /* Initialize GPRS MS side */
4046 f_init_gprs_ms();
4047 ms := g_ms[0]; /* We only use first MS in this test */
4048
4049 /* Initialize the PCU interface abstraction */
4050 f_init_raw(testcasename(), info_ind);
4051
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004052 /* Make sure we are not affected by full cache from previous tests */
4053 f_pcuvty_flush_neigh_caches();
4054
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004055 /* Establish BSSGP connection to the PCU */
4056 f_bssgp_establish();
4057 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4058
4059 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004060 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 +01004061 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4062 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4063
4064 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004065 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004066
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004067 f_shutdown(__BFILE__, __LINE__, final := true);
4068}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004069
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004070/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4071testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4072 var PollFnCtx pollctx;
4073 var GprsMS ms;
4074 var RlcmacDlBlock dl_block;
4075 var uint32_t sched_fn;
4076 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004077
4078 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4079 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4080
4081 /* Initialize NS/BSSGP side */
4082 f_init_bssgp();
4083 /* Initialize GPRS MS side */
4084 f_init_gprs_ms();
4085 ms := g_ms[0]; /* We only use first MS in this test */
4086
4087 /* Initialize the PCU interface abstraction */
4088 f_init_raw(testcasename(), info_ind);
4089
4090 /* Make sure we are not affected by full cache from previous tests */
4091 f_pcuvty_flush_neigh_caches();
4092
4093 /* Establish BSSGP connection to the PCU */
4094 f_bssgp_establish();
4095 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4096
4097 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004098 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 +01004099 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4100 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4101
4102 /* Start NACC from MS side, avoid sending final CTRL ACK */
4103 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4104
4105 /* Wait until we receive something non-dummy */
4106 dl_block := f_skip_dummy(0, sched_fn);
4107 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4108 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4109 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4110 }
4111 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4112 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4113 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4114 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4115 }
4116
4117 f_shutdown(__BFILE__, __LINE__, final := true);
4118}
4119
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004120/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4121testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4122 var PollFnCtx pollctx;
4123 var GprsMS ms;
4124 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004125 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004126
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004127 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4128 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004129
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004130 /* Initialize NS/BSSGP side */
4131 f_init_bssgp();
4132 /* Initialize GPRS MS side */
4133 f_init_gprs_ms();
4134 ms := g_ms[0]; /* We only use first MS in this test */
4135
4136 /* Initialize the PCU interface abstraction */
4137 f_init_raw(testcasename(), info_ind);
4138
4139 /* Make sure we are not affected by full cache from previous tests */
4140 f_pcuvty_flush_neigh_caches();
4141 /* Set timeout values for caches so that entries will be in cache during second try */
4142 f_pcuvty_set_neigh_caches(10, 10);
4143
4144 /* Establish BSSGP connection to the PCU */
4145 f_bssgp_establish();
4146 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4147
4148 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004149 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 +01004150 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4151 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4152
4153 /* Start NACC from MS side */
4154 f_outbound_nacc_success(ms, info_ind);
4155
4156 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4157 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004158
4159 f_shutdown(__BFILE__, __LINE__, final := true);
4160}
4161
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004162/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4163 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4164 */
4165testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4166 var PollFnCtx pollctx;
4167 var GprsMS ms;
4168 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004169 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4170
4171 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4172 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4173
4174 /* Initialize NS/BSSGP side */
4175 f_init_bssgp();
4176 /* Initialize GPRS MS side */
4177 f_init_gprs_ms();
4178 ms := g_ms[0]; /* We only use first MS in this test */
4179
4180 /* Initialize the PCU interface abstraction */
4181 f_init_raw(testcasename(), info_ind);
4182
4183 /* Make sure we are not affected by full cache from previous tests */
4184 f_pcuvty_flush_neigh_caches();
4185 /* Set timeout values for caches so that entries will be erased before the second try */
4186 f_pcuvty_set_neigh_caches(1, 1);
4187
4188 /* Establish BSSGP connection to the PCU */
4189 f_bssgp_establish();
4190 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4191
4192 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004193 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 +01004194 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4195 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4196
4197 /* Start NACC from MS side */
4198 f_outbound_nacc_success(ms, info_ind);
4199
4200 /* CTRL client should have disconnected from us */
4201 f_ipa_ctrl_wait_link_down();
4202 /* wait for cache entries to time out */
4203 f_sleep(2.0);
4204 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4205 f_outbound_nacc_success(ms, info_ind);
4206
4207 f_shutdown(__BFILE__, __LINE__, final := true);
4208}
4209
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004210/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004211testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4212 var RlcmacDlBlock dl_block;
4213 var PollFnCtx pollctx;
4214 var uint32_t sched_fn;
4215 var GprsMS ms;
4216 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4217 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004218 var GsmArfcn req_arfcn := 862;
4219 var uint6_t req_bsic := 43;
4220
4221 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4222 * resolution CTRL port, to trigger Conn Refused by socket:
4223 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4224 */
4225
4226 /* Initialize NS/BSSGP side */
4227 f_init_bssgp();
4228 /* Initialize GPRS MS side */
4229 f_init_gprs_ms();
4230 ms := g_ms[0]; /* We only use first MS in this test */
4231
4232 /* Initialize the PCU interface abstraction */
4233 f_init_raw(testcasename(), info_ind);
4234
4235 /* Make sure we are not affected by full cache from previous tests */
4236 f_pcuvty_flush_neigh_caches();
4237
4238 /* Establish BSSGP connection to the PCU */
4239 f_bssgp_establish();
4240 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4241
4242 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004243 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 +01004244 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4245 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4246
4247 /* Start NACC from MS side */
4248 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4249 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4250
4251 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004252 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004253 /* Make sure it is a Pkt Cell Chg Continue */
4254 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4255 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4256 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004257 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4258 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4259 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4260 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4261 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004262
4263 f_shutdown(__BFILE__, __LINE__, final := true);
4264}
4265
4266/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004267testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4268 var RlcmacDlBlock dl_block;
4269 var PollFnCtx pollctx;
4270 var uint32_t sched_fn;
4271 var GprsMS ms;
4272 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4273 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004274 var GsmArfcn req_arfcn := 862;
4275 var uint6_t req_bsic := 43;
4276
4277 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4278 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4279
4280 /* Initialize NS/BSSGP side */
4281 f_init_bssgp();
4282 /* Initialize GPRS MS side */
4283 f_init_gprs_ms();
4284 ms := g_ms[0]; /* We only use first MS in this test */
4285
4286 /* Initialize the PCU interface abstraction */
4287 f_init_raw(testcasename(), info_ind);
4288
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004289 /* Make sure we are not affected by full cache from previous tests */
4290 f_pcuvty_flush_neigh_caches();
4291
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004292 /* Establish BSSGP connection to the PCU */
4293 f_bssgp_establish();
4294 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4295
4296 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004297 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 +01004298 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4299 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4300
4301 /* Start NACC from MS side */
4302 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4303 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4304
4305 /* osmo-pcu should now ask for resolution: */
4306 f_ipa_ctrl_wait_link_up();
4307 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4308 int2str(info_ind.lac) & "." &
4309 int2str(info_ind.cell_id) & "." &
4310 int2str(req_arfcn) & "." &
4311 int2str(req_bsic);
4312 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4313 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4314
4315 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004316 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004317 /* Make sure it is a Pkt Cell Chg Continue */
4318 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4319 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4320 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004321 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4322 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4323 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4324 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4325 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004326
4327 f_shutdown(__BFILE__, __LINE__, final := true);
4328}
4329
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004330/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4331testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4332 var RlcmacDlBlock dl_block;
4333 var PollFnCtx pollctx;
4334 var uint32_t sched_fn;
4335 var GprsMS ms;
4336 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4337 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004338 var GsmArfcn req_arfcn := 862;
4339 var uint6_t req_bsic := 43;
4340
4341 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4342 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4343
4344 /* Initialize NS/BSSGP side */
4345 f_init_bssgp();
4346 /* Initialize GPRS MS side */
4347 f_init_gprs_ms();
4348 ms := g_ms[0]; /* We only use first MS in this test */
4349
4350 /* Initialize the PCU interface abstraction */
4351 f_init_raw(testcasename(), info_ind);
4352
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004353 /* Make sure we are not affected by full cache from previous tests */
4354 f_pcuvty_flush_neigh_caches();
4355
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004356 /* Establish BSSGP connection to the PCU */
4357 f_bssgp_establish();
4358 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4359
4360 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004361 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 +01004362 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4363 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4364
4365 /* Start NACC from MS side */
4366 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4367 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4368
4369 /* osmo-pcu should now ask for resolution: */
4370 f_ipa_ctrl_wait_link_up();
4371 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4372 int2str(info_ind.lac) & "." &
4373 int2str(info_ind.cell_id) & "." &
4374 int2str(req_arfcn) & "." &
4375 int2str(req_bsic);
4376 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4377 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4378
4379 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004380 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004381 /* Make sure it is a Pkt Cell Chg Continue */
4382 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4383 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4384 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004385 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4386 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4387 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4388 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4389 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004390
4391 f_shutdown(__BFILE__, __LINE__, final := true);
4392}
4393
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004394/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4395testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4396 var RlcmacDlBlock dl_block;
4397 var PollFnCtx pollctx;
4398 var uint32_t sched_fn;
4399 var GprsMS ms;
4400 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4401 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004402 var GsmArfcn req_arfcn := 862;
4403 var uint6_t req_bsic := 43;
4404 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 */
4405 info_ind.lac),
4406 info_ind.rac),
4407 info_ind.cell_id));
4408 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4409 423),
4410 2),
4411 5));
4412 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4413 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4414
4415 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4416 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4417
4418 /* Initialize NS/BSSGP side */
4419 f_init_bssgp();
4420 /* Initialize GPRS MS side */
4421 f_init_gprs_ms();
4422 ms := g_ms[0]; /* We only use first MS in this test */
4423
4424 /* Initialize the PCU interface abstraction */
4425 f_init_raw(testcasename(), info_ind);
4426
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004427 /* Make sure we are not affected by full cache from previous tests */
4428 f_pcuvty_flush_neigh_caches();
4429
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004430 /* Establish BSSGP connection to the PCU */
4431 f_bssgp_establish();
4432 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4433
4434 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004435 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 +01004436 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4437 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4438
4439 /* Start NACC from MS side */
4440 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4441 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4442
4443 /* osmo-pcu should now ask for resolution: */
4444 f_ipa_ctrl_wait_link_up();
4445 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4446 int2str(info_ind.lac) & "." &
4447 int2str(info_ind.cell_id) & "." &
4448 int2str(req_arfcn) & "." &
4449 int2str(req_bsic);
4450 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4451
4452 /* RIM procedure: */
4453 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4454 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4455 tr_RAN_Information_Request_RIM_Container));
4456 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4457
4458 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004459 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004460 /* Make sure it is a Pkt Cell Chg Continue */
4461 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4462 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4463 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004464 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4465 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4466 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4467 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4468 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004469
4470 f_shutdown(__BFILE__, __LINE__, final := true);
4471}
4472
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004473/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4474testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4475 var PollFnCtx pollctx;
4476 var GprsMS ms;
4477 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4478 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4479 var RlcmacDlBlock dl_block;
4480 var uint32_t sched_fn;
4481 var CtrlMessage rx_ctrl;
4482 var GsmArfcn req_arfcn := 862;
4483 var uint6_t req_bsic := 43;
4484
4485 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4486 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4487
4488 /* Initialize NS/BSSGP side */
4489 f_init_bssgp();
4490 /* Initialize GPRS MS side */
4491 f_init_gprs_ms();
4492 ms := g_ms[0]; /* We only use first MS in this test */
4493
4494 /* Initialize the PCU interface abstraction */
4495 f_init_raw(testcasename(), info_ind);
4496
4497 /* Make sure we are not affected by full cache from previous tests */
4498 f_pcuvty_flush_neigh_caches();
4499
4500 /* Establish BSSGP connection to the PCU */
4501 f_bssgp_establish();
4502 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4503
4504 /* Send PACKET RESOURCE REQUEST */
4505 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4506 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4507 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4508
4509 /* Start NACC from MS side */
4510 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4511 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4512
4513 /* osmo-pcu should now ask for resolution: */
4514 f_ipa_ctrl_wait_link_up();
4515 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4516 int2str(info_ind.lac) & "." &
4517 int2str(info_ind.cell_id) & "." &
4518 int2str(req_arfcn) & "." &
4519 int2str(req_bsic);
4520 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4521 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4522 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4523 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4524 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4525 timer T := 2.0;
4526 T.start;
4527 alt {
4528 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4529 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4530 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4531 f_shutdown(__BFILE__, __LINE__);
4532 }
4533 [] T.timeout {
4534 setverdict(pass);
4535 }
4536 }
4537
4538 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004539 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004540
4541 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4542 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4543 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4544 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4545 f_shutdown(__BFILE__, __LINE__);
4546 }
4547 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4548 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4549 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4550 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4551 }
4552
4553 f_shutdown(__BFILE__, __LINE__, final := true);
4554}
4555
4556/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4557testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4558 var PollFnCtx pollctx;
4559 var GprsMS ms;
4560 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4561 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4562 var RlcmacDlBlock dl_block;
4563 var uint32_t sched_fn;
4564 var CtrlMessage rx_ctrl;
4565 var GsmArfcn req_arfcn := 862;
4566 var uint6_t req_bsic := 43;
4567
4568 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4569 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4570
4571 /* Initialize NS/BSSGP side */
4572 f_init_bssgp();
4573 /* Initialize GPRS MS side */
4574 f_init_gprs_ms();
4575 ms := g_ms[0]; /* We only use first MS in this test */
4576
4577 /* Initialize the PCU interface abstraction */
4578 f_init_raw(testcasename(), info_ind);
4579
4580 /* Make sure we are not affected by full cache from previous tests */
4581 f_pcuvty_flush_neigh_caches();
4582
4583 /* Establish BSSGP connection to the PCU */
4584 f_bssgp_establish();
4585 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4586
4587 /* Send PACKET RESOURCE REQUEST */
4588 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4589 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4590 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4591
4592 /* Start NACC from MS side */
4593 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4594 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4595
4596 /* osmo-pcu should now ask for resolution: */
4597 f_ipa_ctrl_wait_link_up();
4598 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4599 int2str(info_ind.lac) & "." &
4600 int2str(info_ind.cell_id) & "." &
4601 int2str(req_arfcn) & "." &
4602 int2str(req_bsic);
4603 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4604 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4605 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4606 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4607 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4608 f_outbound_nacc_rim_tx_resp(info_ind);
4609 timer T := 1.0;
4610 T.start;
4611 alt {
4612 [] RIM.receive {
4613 setverdict(fail, "Received unexpected RIM message");
4614 f_shutdown(__BFILE__, __LINE__);
4615 }
4616 [] T.timeout {
4617 setverdict(pass);
4618 }
4619 }
4620
4621 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004622 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004623
4624 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4625 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4626 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4627 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4628 f_shutdown(__BFILE__, __LINE__);
4629 }
4630 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4631 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4632 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4633 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4634 }
4635
4636 f_shutdown(__BFILE__, __LINE__, final := true);
4637}
4638
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004639/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4640testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4641 var PollFnCtx pollctx;
4642 var GprsMS ms;
4643 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4644 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4645 var RlcmacDlBlock dl_block;
4646 var uint32_t sched_fn;
4647 var CtrlMessage rx_ctrl;
4648 var GsmArfcn req_arfcn := 862;
4649 var uint6_t req_bsic := 43;
4650
4651 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4652 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4653
4654 /* Initialize NS/BSSGP side */
4655 f_init_bssgp();
4656 /* Initialize GPRS MS side */
4657 f_init_gprs_ms();
4658 ms := g_ms[0]; /* We only use first MS in this test */
4659
4660 /* Initialize the PCU interface abstraction */
4661 f_init_raw(testcasename(), info_ind);
4662
4663 /* Make sure we are not affected by full cache from previous tests */
4664 f_pcuvty_flush_neigh_caches();
4665
4666 /* Establish BSSGP connection to the PCU */
4667 f_bssgp_establish();
4668 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4669
4670 /* Send PACKET RESOURCE REQUEST */
4671 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4672 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4673 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4674
4675 /* Start NACC from MS side */
4676 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4677 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4678
4679 /* osmo-pcu should now ask for resolution: */
4680 f_ipa_ctrl_wait_link_up();
4681 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4682 int2str(info_ind.lac) & "." &
4683 int2str(info_ind.cell_id) & "." &
4684 int2str(req_arfcn) & "." &
4685 int2str(req_bsic);
4686 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4687 /* RIM procedure: */
4688 as_outbound_nacc_rim_resolve(info_ind);
4689
4690 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4691 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4692 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4693
4694 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4695 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4696
4697 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4698 f_rx_rlcmac_dl_block(dl_block, sched_fn);
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 f_shutdown(__BFILE__, __LINE__);
4702 }
4703 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4704 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4705 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4706 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4707 }
4708}
4709
4710/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4711testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4712 var PollFnCtx pollctx;
4713 var GprsMS ms;
4714 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4715 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4716 var RlcmacDlBlock dl_block;
4717 var uint32_t sched_fn;
4718 var CtrlMessage rx_ctrl;
4719 var GsmArfcn req_arfcn := 862;
4720 var uint6_t req_bsic := 43;
4721
4722 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4723 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4724
4725 /* Initialize NS/BSSGP side */
4726 f_init_bssgp();
4727 /* Initialize GPRS MS side */
4728 f_init_gprs_ms();
4729 ms := g_ms[0]; /* We only use first MS in this test */
4730
4731 /* Initialize the PCU interface abstraction */
4732 f_init_raw(testcasename(), info_ind);
4733
4734 /* Make sure we are not affected by full cache from previous tests */
4735 f_pcuvty_flush_neigh_caches();
4736
4737 /* Establish BSSGP connection to the PCU */
4738 f_bssgp_establish();
4739 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4740
4741 /* Send PACKET RESOURCE REQUEST */
4742 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4743 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4744 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4745
4746 /* Start NACC from MS side */
4747 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4748 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4749
4750 /* osmo-pcu should now ask for resolution: */
4751 f_ipa_ctrl_wait_link_up();
4752 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4753 int2str(info_ind.lac) & "." &
4754 int2str(info_ind.cell_id) & "." &
4755 int2str(req_arfcn) & "." &
4756 int2str(req_bsic);
4757 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4758 /* RIM procedure: */
4759 as_outbound_nacc_rim_resolve(info_ind);
4760
4761 /* Announce SI back to MS, continue NACC procedure */
4762 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4763
4764 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4765 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4766
4767 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4768 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4769 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4770 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4771 f_shutdown(__BFILE__, __LINE__);
4772 }
4773 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4774 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4775 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4776 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4777 }
4778}
4779
4780/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
4781testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
4782 var PollFnCtx pollctx;
4783 var GprsMS ms;
4784 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4785 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4786 var RlcmacDlBlock dl_block;
4787 var uint32_t sched_fn;
4788 var CtrlMessage rx_ctrl;
4789 var GsmArfcn req_arfcn := 862;
4790 var uint6_t req_bsic := 43;
4791
4792 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4793 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4794
4795 /* Initialize NS/BSSGP side */
4796 f_init_bssgp();
4797 /* Initialize GPRS MS side */
4798 f_init_gprs_ms();
4799 ms := g_ms[0]; /* We only use first MS in this test */
4800
4801 /* Initialize the PCU interface abstraction */
4802 f_init_raw(testcasename(), info_ind);
4803
4804 /* Make sure we are not affected by full cache from previous tests */
4805 f_pcuvty_flush_neigh_caches();
4806
4807 /* Establish BSSGP connection to the PCU */
4808 f_bssgp_establish();
4809 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4810
4811 /* Send PACKET RESOURCE REQUEST */
4812 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4813 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4814 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4815
4816 /* Start NACC from MS side */
4817 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4818 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4819
4820 /* osmo-pcu should now ask for resolution: */
4821 f_ipa_ctrl_wait_link_up();
4822 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4823 int2str(info_ind.lac) & "." &
4824 int2str(info_ind.cell_id) & "." &
4825 int2str(req_arfcn) & "." &
4826 int2str(req_bsic);
4827 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4828 /* RIM procedure: */
4829 as_outbound_nacc_rim_resolve(info_ind);
4830
4831 /* Announce SI back to MS, continue NACC procedure */
4832 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4833
4834 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4835 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4836 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4837 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4838 f_shutdown(__BFILE__, __LINE__);
4839 }
4840 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4841 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4842
4843 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4844 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4845 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4846 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4847 }
4848}
4849
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004850/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4851 * while waiting for CTRL resolution */
4852testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
4853 var PollFnCtx pollctx;
4854 var GprsMS ms;
4855 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4856 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4857 var RlcmacDlBlock dl_block;
4858 var uint32_t sched_fn;
4859 var CtrlMessage rx_ctrl;
4860 var GsmArfcn req_arfcn := 862;
4861 var uint6_t req_bsic := 43;
4862
4863 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4864 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4865
4866 /* Initialize NS/BSSGP side */
4867 f_init_bssgp();
4868 /* Initialize GPRS MS side */
4869 f_init_gprs_ms();
4870 ms := g_ms[0]; /* We only use first MS in this test */
4871
4872 /* Initialize the PCU interface abstraction */
4873 f_init_raw(testcasename(), info_ind);
4874
4875 /* Make sure we are not affected by full cache from previous tests */
4876 f_pcuvty_flush_neigh_caches();
4877
4878 /* Establish BSSGP connection to the PCU */
4879 f_bssgp_establish();
4880 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4881
4882 /* Send PACKET RESOURCE REQUEST */
4883 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4884 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4885 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4886
4887 /* Start NACC from MS side */
4888 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4889 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4890
4891 /* osmo-pcu should now ask for resolution: */
4892 f_ipa_ctrl_wait_link_up();
4893 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4894 int2str(info_ind.lac) & "." &
4895 int2str(info_ind.cell_id) & "." &
4896 int2str(req_arfcn) & "." &
4897 int2str(req_bsic);
4898 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4899 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
4900 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
4901 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4902 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4903 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4904 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
4905 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4906 int2str(info_ind.lac) & "." &
4907 int2str(info_ind.cell_id) & "." &
4908 int2str(req_arfcn + 1) & "." &
4909 int2str(req_bsic + 1);
4910 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4911
4912 /* And finally everything continues as usual with RIN procedure */
4913 as_outbound_nacc_rim_resolve(info_ind);
4914
4915 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004916 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004917
4918 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4919 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4920 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4921 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4922 f_shutdown(__BFILE__, __LINE__);
4923 }
4924 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4925 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4926 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4927 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4928 }
4929
4930 f_shutdown(__BFILE__, __LINE__, final := true);
4931}
4932
4933/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4934 * while waiting for SI resolution */
4935testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
4936 var PollFnCtx pollctx;
4937 var GprsMS ms;
4938 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4939 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4940 var RlcmacDlBlock dl_block;
4941 var uint32_t sched_fn;
4942 var CtrlMessage rx_ctrl;
4943 var GsmArfcn req_arfcn := 862;
4944 var uint6_t req_bsic := 43;
4945
4946 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4947 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4948
4949 /* Initialize NS/BSSGP side */
4950 f_init_bssgp();
4951 /* Initialize GPRS MS side */
4952 f_init_gprs_ms();
4953 ms := g_ms[0]; /* We only use first MS in this test */
4954
4955 /* Initialize the PCU interface abstraction */
4956 f_init_raw(testcasename(), info_ind);
4957
4958 /* Make sure we are not affected by full cache from previous tests */
4959 f_pcuvty_flush_neigh_caches();
4960
4961 /* Establish BSSGP connection to the PCU */
4962 f_bssgp_establish();
4963 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4964
4965 /* Send PACKET RESOURCE REQUEST */
4966 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4967 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4968 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4969
4970 /* Start NACC from MS side */
4971 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4972 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4973
4974 /* osmo-pcu should now ask for resolution: */
4975 f_ipa_ctrl_wait_link_up();
4976 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4977 int2str(info_ind.lac) & "." &
4978 int2str(info_ind.cell_id) & "." &
4979 int2str(req_arfcn) & "." &
4980 int2str(req_bsic);
4981 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4982 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4983 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
4984 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
4985 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4986 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4987 f_outbound_nacc_rim_tx_resp(info_ind);
4988
4989 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
4990 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4991 int2str(info_ind.lac) & "." &
4992 int2str(info_ind.cell_id) & "." &
4993 int2str(req_arfcn + 1) & "." &
4994 int2str(req_bsic + 1);
4995 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4996
4997 /* And finally everything continues as usual with RIN procedure */
4998 as_outbound_nacc_rim_resolve(info_ind);
4999
5000 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005001 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005002
5003 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5004 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5005 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5006 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5007 f_shutdown(__BFILE__, __LINE__);
5008 }
5009 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5010 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5011 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5012 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5013 }
5014
5015 f_shutdown(__BFILE__, __LINE__, final := true);
5016}
5017
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005018/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5019 * while sending Pkt Neigh Data Change */
5020testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5021 var PollFnCtx pollctx;
5022 var GprsMS ms;
5023 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5024 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5025 var RlcmacDlBlock dl_block;
5026 var uint32_t sched_fn;
5027 var CtrlMessage rx_ctrl;
5028 var GsmArfcn req_arfcn := 862;
5029 var uint6_t req_bsic := 43;
5030
5031 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5032 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5033
5034 /* Initialize NS/BSSGP side */
5035 f_init_bssgp();
5036 /* Initialize GPRS MS side */
5037 f_init_gprs_ms();
5038 ms := g_ms[0]; /* We only use first MS in this test */
5039
5040 /* Initialize the PCU interface abstraction */
5041 f_init_raw(testcasename(), info_ind);
5042
5043 /* Make sure we are not affected by full cache from previous tests */
5044 f_pcuvty_flush_neigh_caches();
5045
5046 /* Establish BSSGP connection to the PCU */
5047 f_bssgp_establish();
5048 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5049
5050 /* Send PACKET RESOURCE REQUEST */
5051 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5052 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5053 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5054
5055 /* Start NACC from MS side */
5056 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5057 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5058
5059 /* osmo-pcu should now ask for resolution: */
5060 f_ipa_ctrl_wait_link_up();
5061 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5062 int2str(info_ind.lac) & "." &
5063 int2str(info_ind.cell_id) & "." &
5064 int2str(req_arfcn) & "." &
5065 int2str(req_bsic);
5066 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5067 /* RIM procedure: */
5068 as_outbound_nacc_rim_resolve(info_ind);
5069
5070 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5071 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5072 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5073 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5074
5075 /* It should trigger RAC_CI resolution to start again: */
5076 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5077 int2str(info_ind.lac) & "." &
5078 int2str(info_ind.cell_id) & "." &
5079 int2str(req_arfcn + 1) & "." &
5080 int2str(req_bsic + 1);
5081 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5082 /* RIM procedure: */
5083 as_outbound_nacc_rim_resolve(info_ind);
5084 /* Transmit SI back to MS */
5085 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5086
5087 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5088 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5089 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5090 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5091 f_shutdown(__BFILE__, __LINE__);
5092 }
5093 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5094 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5095 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5096 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5097 }
5098}
5099
5100/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5101testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5102 var PollFnCtx pollctx;
5103 var GprsMS ms;
5104 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5105 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5106 var RlcmacDlBlock dl_block;
5107 var uint32_t sched_fn;
5108 var CtrlMessage rx_ctrl;
5109 var GsmArfcn req_arfcn := 862;
5110 var uint6_t req_bsic := 43;
5111
5112 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5113 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5114
5115 /* Initialize NS/BSSGP side */
5116 f_init_bssgp();
5117 /* Initialize GPRS MS side */
5118 f_init_gprs_ms();
5119 ms := g_ms[0]; /* We only use first MS in this test */
5120
5121 /* Initialize the PCU interface abstraction */
5122 f_init_raw(testcasename(), info_ind);
5123
5124 /* Make sure we are not affected by full cache from previous tests */
5125 f_pcuvty_flush_neigh_caches();
5126
5127 /* Establish BSSGP connection to the PCU */
5128 f_bssgp_establish();
5129 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5130
5131 /* Send PACKET RESOURCE REQUEST */
5132 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5133 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5134 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5135
5136 /* Start NACC from MS side */
5137 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5138 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5139
5140 /* osmo-pcu should now ask for resolution: */
5141 f_ipa_ctrl_wait_link_up();
5142 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5143 int2str(info_ind.lac) & "." &
5144 int2str(info_ind.cell_id) & "." &
5145 int2str(req_arfcn) & "." &
5146 int2str(req_bsic);
5147 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5148 /* RIM procedure: */
5149 as_outbound_nacc_rim_resolve(info_ind);
5150
5151 /* Announce SI back to MS, continue NACC procedure */
5152 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5153
5154 /* trigger a Pkt Cell Change Notif with different tgt cell */
5155 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5156 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5157
5158 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5159 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5160
5161 /* It should trigger RAC_CI resolution to start again: */
5162 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5163 int2str(info_ind.lac) & "." &
5164 int2str(info_ind.cell_id) & "." &
5165 int2str(req_arfcn + 1) & "." &
5166 int2str(req_bsic + 1);
5167 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5168 /* RIM procedure: */
5169 as_outbound_nacc_rim_resolve(info_ind);
5170 /* Transmit SI back to MS */
5171 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5172
5173 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5174 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5175 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5176 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5177 f_shutdown(__BFILE__, __LINE__);
5178 }
5179 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5180 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5181 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5182 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5183 }
5184}
5185
5186/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5187testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5188 var PollFnCtx pollctx;
5189 var GprsMS ms;
5190 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5191 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5192 var RlcmacDlBlock dl_block;
5193 var uint32_t sched_fn;
5194 var CtrlMessage rx_ctrl;
5195 var GsmArfcn req_arfcn := 862;
5196 var uint6_t req_bsic := 43;
5197
5198 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5199 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5200
5201 /* Initialize NS/BSSGP side */
5202 f_init_bssgp();
5203 /* Initialize GPRS MS side */
5204 f_init_gprs_ms();
5205 ms := g_ms[0]; /* We only use first MS in this test */
5206
5207 /* Initialize the PCU interface abstraction */
5208 f_init_raw(testcasename(), info_ind);
5209
5210 /* Make sure we are not affected by full cache from previous tests */
5211 f_pcuvty_flush_neigh_caches();
5212
5213 /* Establish BSSGP connection to the PCU */
5214 f_bssgp_establish();
5215 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5216
5217 /* Send PACKET RESOURCE REQUEST */
5218 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5219 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5220 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5221
5222 /* Start NACC from MS side */
5223 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5224 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5225
5226 /* osmo-pcu should now ask for resolution: */
5227 f_ipa_ctrl_wait_link_up();
5228 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5229 int2str(info_ind.lac) & "." &
5230 int2str(info_ind.cell_id) & "." &
5231 int2str(req_arfcn) & "." &
5232 int2str(req_bsic);
5233 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5234 /* RIM procedure: */
5235 as_outbound_nacc_rim_resolve(info_ind);
5236
5237 /* Announce SI back to MS, continue NACC procedure */
5238 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5239
5240 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5241 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5242 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5243 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5244 f_shutdown(__BFILE__, __LINE__);
5245 }
5246
5247 /* trigger a Pkt Cell Change Notif with different tgt cell */
5248 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5249 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5250
5251 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5252 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5253 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5254 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5255 }
5256 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5257 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5258
5259 /* It should trigger RAC_CI resolution to start again: */
5260 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5261 int2str(info_ind.lac) & "." &
5262 int2str(info_ind.cell_id) & "." &
5263 int2str(req_arfcn + 1) & "." &
5264 int2str(req_bsic + 1);
5265 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5266 /* RIM procedure: */
5267 as_outbound_nacc_rim_resolve(info_ind);
5268 /* Transmit SI back to MS */
5269 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5270
5271 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5272 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5273 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5274 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5275 f_shutdown(__BFILE__, __LINE__);
5276 }
5277 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5278 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5279 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5280 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5281 }
5282}
5283
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005284/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5285testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5286 var PollFnCtx pollctx;
5287 var GprsMS ms;
5288 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5289 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5290 var RlcmacDlBlock dl_block;
5291 var uint32_t sched_fn, dl_fn;
5292 var CtrlMessage rx_ctrl;
5293 var GsmArfcn req_arfcn := 862;
5294 var uint6_t req_bsic := 43;
5295 var octetstring data := f_rnd_octstring(10);
5296
5297 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5298 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5299
5300 /* Initialize NS/BSSGP side */
5301 f_init_bssgp();
5302 /* Initialize GPRS MS side */
5303 f_init_gprs_ms();
5304 ms := g_ms[0]; /* We only use first MS in this test */
5305
5306 /* Initialize the PCU interface abstraction */
5307 f_init_raw(testcasename(), info_ind);
5308
5309 /* Make sure we are not affected by full cache from previous tests */
5310 f_pcuvty_flush_neigh_caches();
5311
5312 /* Establish BSSGP connection to the PCU */
5313 f_bssgp_establish();
5314 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5315
5316 /* Send PACKET RESOURCE REQUEST */
5317 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5318 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5319 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5320
5321 /* Start NACC from MS side */
5322 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5323 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5324
5325 /* osmo-pcu should now ask for resolution: */
5326 f_ipa_ctrl_wait_link_up();
5327 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5328 int2str(info_ind.lac) & "." &
5329 int2str(info_ind.cell_id) & "." &
5330 int2str(req_arfcn) & "." &
5331 int2str(req_bsic);
5332 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5333 /* RIM procedure: */
5334 as_outbound_nacc_rim_resolve(info_ind);
5335
5336 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5337 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5338 f_sleep(0.1);
5339 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5340 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5341
5342 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5343 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5344 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5345 * Data with unassigned DL TBF in line above): */
5346 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5347 /* Continue receiving Pkt Cell Neighbor Data */
5348 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5349
5350 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5351 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5352 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5353 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5354 f_shutdown(__BFILE__, __LINE__);
5355 }
5356 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5357 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5358 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5359 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5360 }
5361
5362 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5363 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5364 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5365 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5366 f_dl_block_ack_fn(dl_block, dl_fn));
5367}
5368
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005369/* Send a RIM RAN info request to the PCU and verify the response, we expect
5370 * getting the system information back which we have transfered to the PCU via
5371 * PCUIF on startup. */
5372testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5373 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005374 timer T := 2.0;
5375
5376 /* Initialize NS/BSSGP side */
5377 f_init_bssgp();
5378
5379 /* Initialize the PCU interface abstraction */
5380 f_init_raw(testcasename());
5381
5382 /* Establish BSSGP connection to the PCU */
5383 f_bssgp_establish();
5384
5385 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005386 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 +01005387 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005388 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 +01005389 BTS.send(si3_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005390 var template PCUIF_Message si16_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0106'O & si13_default, 0, 0, 0, 0, 32767);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005391 BTS.send(si16_data_ind);
5392 f_sleep(1.0);
5393
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005394 var RIM_Routing_Address dst_addr;
5395 var RIM_Routing_Address src_addr;
5396 var template (value) RAN_Information_Request_RIM_Container req_cont;
5397 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005398 var template PDU_BSSGP bssgp_rim_pdu_expect;
5399 var template RAN_Information_RIM_Container rim_cont_expect;
5400
5401 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 +01005402 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5403 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005404
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005405 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5406 ts_RIM_Sequence_Number(1),
5407 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5408 ts_RIM_Protocol_Version_Number(1),
5409 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5410 omit);
5411 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5412 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5413 req_cont);
5414
5415 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5416 tr_RIM_Sequence_Number(1),
5417 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5418 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005419 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 +01005420 omit);
5421
5422 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5423 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5424 rim_cont_expect);
5425 RIM.send(bssgp_rim_pdu);
5426 T.start;
5427 alt {
5428 [] RIM.receive(bssgp_rim_pdu_expect) { }
5429 [] RIM.receive {
5430 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5431 }
5432 [] T.timeout {
5433 setverdict(fail, "No BSSGP RIM PDU received");
5434 mtc.stop;
5435 }
5436 }
5437
5438 f_shutdown(__BFILE__, __LINE__, final := true);
5439}
5440
5441/* Same as above, but in this case we simulate the rare case in which the PCU
5442 * has no system information available. We expect getting a response back but
5443 * with no system information inside. */
5444testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005445 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005446 var PCUIF_Message pcu_msg;
5447 timer T := 2.0;
5448
5449 /* Initialize NS/BSSGP side */
5450 f_init_bssgp();
5451
5452 /* Initialize the PCU interface abstraction */
5453 f_init_raw(testcasename(), info_ind);
5454
5455 /* Establish BSSGP connection to the PCU */
5456 f_bssgp_establish();
5457
5458 /* Clear sysinfo from the PCU */
5459 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);
5460 BTS.send(si1_data_ind);
5461 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);
5462 BTS.send(si3_data_ind);
5463 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);
5464 BTS.send(si16_data_ind);
5465 f_sleep(1.0);
5466
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005467 var RIM_Routing_Address dst_addr;
5468 var RIM_Routing_Address src_addr;
5469 var template (value) RAN_Information_Request_RIM_Container req_cont;
5470 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005471 var template PDU_BSSGP bssgp_rim_pdu_expect;
5472 var template RAN_Information_RIM_Container rim_cont_expect;
5473
5474 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 +01005475 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5476 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005477
5478 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5479 ts_RIM_Sequence_Number(1),
5480 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5481 ts_RIM_Protocol_Version_Number(1),
5482 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5483 omit);
5484 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5485 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5486 req_cont);
5487
5488
5489 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5490 tr_RIM_Sequence_Number(1),
5491 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5492 tr_RIM_Protocol_Version_Number(1),
5493 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5494 omit);
5495
5496 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5497 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5498 rim_cont_expect);
5499 RIM.send(bssgp_rim_pdu);
5500 T.start;
5501 alt {
5502 [] RIM.receive(bssgp_rim_pdu_expect) { }
5503 [] RIM.receive {
5504 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5505 }
5506 [] T.timeout {
5507 setverdict(fail, "No BSSGP RIM PDU received");
5508 mtc.stop;
5509 }
5510 }
5511
5512 f_shutdown(__BFILE__, __LINE__, final := true);
5513}
5514
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005515control {
5516 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005517 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005518 execute( TC_ta_ptcch_idle() );
5519 execute( TC_ta_rach_imm_ass() );
5520 execute( TC_ta_idle_dl_tbf_ass() );
5521 execute( TC_ta_ptcch_ul_multi_tbf() );
5522 execute( TC_cs_lqual_ul_tbf() );
5523 execute( TC_cs_initial_ul() );
5524 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005525 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005526 execute( TC_cs_max_dl() );
5527 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005528 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005529 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005530 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005531 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005532 execute( TC_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005533 execute( TC_x2031_t3191() );
5534 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005535 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005536 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005537 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005538 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005539 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005540 execute( TC_mo_ping_pong() );
5541 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005542 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005543 execute( TC_mt_ping_pong() );
5544 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005545 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005546 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005547 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005548 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005549 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005550 execute( TC_paging_cs_from_bts() );
5551 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5552 execute( TC_paging_cs_from_sgsn_sign() );
5553 execute( TC_paging_cs_from_sgsn_ptp() );
5554 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5555 execute( TC_paging_ps_from_sgsn_sign() );
5556 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005557 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5558 execute( TC_paging_cs_multi_ms_imsi() );
5559 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005560 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5561 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005562 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5563 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005564
5565 /* EGPRS specific test cases */
5566 execute( TC_egprs_pkt_chan_req_signalling() );
5567 execute( TC_egprs_pkt_chan_req_one_phase() );
5568 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005569 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005570 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005571 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005572
5573 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005574
5575 /* Frequency hopping specific test cases */
5576 if (PCUIF_Types.mp_pcuif_version >= 10) {
5577 /* Immediate Assignment on AGCH/PCH */
5578 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5579 execute( TC_pcuif_fh_imm_ass_ul() );
5580 execute( TC_pcuif_fh_imm_ass_dl() );
5581 /* Packet Uplink/Downlink Assignment on PACCH */
5582 execute( TC_pcuif_fh_pkt_ass_ul() );
5583 execute( TC_pcuif_fh_pkt_ass_dl() );
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02005584 execute( TC_multitrx_multims_alloc() );
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01005585 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01005586 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01005587 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005588 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005589 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005590
5591 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005592 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005593 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005594 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005595 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005596 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005597 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005598 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005599 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005600 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5601 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005602 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5603 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5604 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005605 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5606 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005607 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5608 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5609 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005610 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005611
5612 execute( TC_rim_ran_info_req_single_rep() );
5613 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005614}
5615
Harald Weltea419df22019-03-21 17:23:04 +01005616}