blob: 64a83f401d001bb86f8454e0a7bab970b33a9572 [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 Pedrol487d6342020-05-14 19:22:33 +02001550/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1551testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001552 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001553 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001554 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001555 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001556
1557 /* Initialize NS/BSSGP side */
1558 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001559 /* Initialize GPRS MS side */
1560 f_init_gprs_ms();
1561 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001562
1563 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001564 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001565
1566 /* Establish BSSGP connection to the PCU */
1567 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001568 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001569
1570 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001571 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001572
1573 /* Send one UL block (with TLLI since we are in One-Phase Access
1574 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001575 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001576 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
1577 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001578 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1579 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001580 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001581
1582 /* Send enough blocks to test whole procedure: Until Nth block
1583 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1584 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001585 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001586 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1587 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001588 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001589
1590 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001591 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 +07001592
1593 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001594}
1595
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001596/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1597testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1598 var RlcmacDlBlock dl_block;
1599 var uint32_t dl_fn, sched_fn;
1600 var octetstring payload;
1601 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001602 var template (value) LlcBlockHdr blk_hdr;
1603 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001604 var integer blk_len;
1605 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001606 var GprsMS ms;
1607
1608 /* Initialize NS/BSSGP side */
1609 f_init_bssgp();
1610 /* Initialize GPRS MS side */
1611 f_init_gprs_ms();
1612 ms := g_ms[0]; /* We only use first MS in this test */
1613
1614 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001615 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001616
1617 /* Establish BSSGP connection to the PCU */
1618 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001619 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001620
1621 /* Establish an Uplink TBF */
1622 f_ms_establish_ul_tbf(ms);
1623
1624 /* Send one UL block (with TLLI since we are in One-Phase Access
1625 contention resoultion) and make sure it is ACKED fine. */
1626 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001627 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1628 more := false, e := true);
1629 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001630 /* 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 +01001631 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1632 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001633 cv := 15,
1634 bsn := ms.ul_tbf.bsn,
1635 blocks := blocks,
1636 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001637 f_ultbf_inc_bsn(ms.ul_tbf);
1638 f_ms_tx_ul_block(ms, ul_data);
1639
1640 /* ACK and check it was received fine */
1641 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1642 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1643 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1644 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001645 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 +02001646
1647 /* Test sending LLC PDUS of incrementing size */
1648 var integer max_size := 49;
1649 for (var integer i := 1; i <= max_size; i := i + 1) {
1650 var integer cv;
1651 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1652 log("Sending DATA.ind with LLC payload size ", i);
1653 if (i < max_size - g_bs_cv_max) {
1654 cv := 15;
1655 } else {
1656 cv := max_size - i;
1657 }
1658
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001659 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1660 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001661 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001662 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1663 more := false, e := true);
1664 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001665 /* 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 +01001666 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1667 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001668 cv := cv,
1669 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001670 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001671 f_ultbf_inc_bsn(ms.ul_tbf);
1672 f_ms_tx_ul_block(ms, ul_data);
1673
1674 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001675 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 +02001676
1677 /* we will receive UL ACK/NACK from time to time, handle it. */
1678 f_rx_rlcmac_dl_block(dl_block, dl_fn);
1679 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1680 continue;
1681 }
1682 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
1683 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1684 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1685 f_shutdown(__BFILE__, __LINE__);
1686 }
1687
1688 log("Rx Packet Uplink ACK / NACK");
1689 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
1690 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1691 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1692 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001693
1694 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001695}
1696
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001697function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
1698 var octetstring payload;
1699 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001700 var template (value) LlcBlockHdr blk_hdr;
1701 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001702 var integer block_len, max_valid_data_len;
1703 timer T;
1704
1705 block_len := f_rlcmac_cs_mcs2block_len(cs);
1706 /* We need to send with TLLI since we are in One-Phase Access Contenion
1707 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
1708 * indicator, -1 for spare bits octet at the end */
1709 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
1710 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 +07001711 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1712 more := false, e := true);
1713 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001714 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
1715 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001716 cv := cv,
1717 bsn := ms.ul_tbf.bsn,
1718 blocks := blocks,
1719 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001720 f_ultbf_inc_bsn(ms.ul_tbf);
1721 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
1722
1723 T.start(0.5);
1724 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02001725 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001726 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
1727 f_shutdown(__BFILE__, __LINE__);
1728 }
1729 [] T.timeout {
1730 setverdict(pass);
1731 }
1732 }
1733}
1734/* Verify PCU finds out incorrectly formated RLC block and discards it. This
1735 blocks intentionally contain last byte of data placed in last byte of RLC
1736 containing padding/spare bits, which is incorrect. Spare bits exist and are
1737 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
1738 discounting padding in octet" */
1739testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
1740 var GprsMS ms;
1741 var integer block_len, max_valid_data_len;
1742
1743 /* Initialize NS/BSSGP side */
1744 f_init_bssgp();
1745 /* Initialize GPRS MS side */
1746 f_init_gprs_ms();
1747 ms := g_ms[0]; /* We only use first MS in this test */
1748
1749 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001750 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001751
1752 /* Establish BSSGP connection to the PCU */
1753 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001754 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001755
1756 /* Establish an Uplink TBF */
1757 f_ms_establish_ul_tbf(ms);
1758
1759 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
1760 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
1761 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
1762
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001763 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001764}
1765
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001766/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1767 * answered, so TBFs for uplink and later for downlink are created.
1768 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001769private 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 +02001770 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001771 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001772 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001773 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001774 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001775
1776 /* Initialize NS/BSSGP side */
1777 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001778 /* Initialize GPRS MS side */
1779 f_init_gprs_ms();
1780 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001781
1782 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001783 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001784
1785 /* Establish BSSGP connection to the PCU */
1786 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001787 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001788
1789 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001790 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001791
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001792 /* Send one UL block (with TLLI since we are in One-Phase Access
1793 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001794 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001795 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1796 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001797 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001798
1799 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02001800 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001801
1802 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001803 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1804 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001805
1806 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1807 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001808 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001809
1810 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001811 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1812 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1813 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001814
1815 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001816}
1817
1818/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1819 * answered, so TBFs for uplink and later for downlink are created.
1820 */
1821testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001822 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001823 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001824}
1825
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001826/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1827 * answered, so TBFs for uplink and later for downlink are created.
1828 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001829private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
1830 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02001831 template (present) CodingScheme exp_ul_cs_mcs := ?,
1832 template (present) CodingScheme exp_dl_cs_mcs := ?)
1833runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001834 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001835 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01001836 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001837 var uint32_t sched_fn;
1838 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02001839 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001840 var GprsMS ms;
1841
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001842 /* Initialize NS/BSSGP side */
1843 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001844 /* Initialize GPRS MS side */
1845 f_init_gprs_ms();
1846 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001847
1848 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001849 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001850
1851 /* Establish BSSGP connection to the PCU */
1852 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001853 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001854
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01001855 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
1856 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 +02001857
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001858 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
1859 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 +02001860 f_shutdown(__BFILE__, __LINE__);
1861 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001862
1863 /* Send one UL block (without TLLI since we are in Second-Phase Access)
1864 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01001865 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001866
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001867 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01001868 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 +02001869
1870 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02001871 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001872
1873 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001874 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01001875 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
1876 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001877 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001878 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001879 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001880
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02001881 /* PCU acks the UL data after having received CV=0) */
1882 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1883
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001884 /* 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 +02001885 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 +02001886
1887 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001888 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1889 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 +02001890 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001891
1892 f_shutdown(__BFILE__, __LINE__, final := true);
1893}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001894
1895testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001896 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
1897 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001898
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001899 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 +02001900}
1901
1902testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001903 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
1904 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02001905
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001906 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 +02001907}
1908
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02001909testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
1910 /* Configure PCU to force two phase access */
1911 g_force_two_phase_access := true;
1912
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02001913 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001914 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02001915
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001916 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 +02001917}
1918
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001919/* Test scenario where SGSN wants to send some data against MS and it is
1920 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
1921 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07001922private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
1923 template (present) CodingScheme exp_cs_mcs := ?)
1924runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001925 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001926 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001927 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001928 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001929 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001930
1931 /* Initialize NS/BSSGP side */
1932 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001933 /* Initialize GPRS MS side */
1934 f_init_gprs_ms();
1935 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001936
1937 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001938 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001939
1940 /* Establish BSSGP connection to the PCU */
1941 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001942 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001943
1944 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001945 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
1946 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001947
1948 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1949 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001950 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001951
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02001952 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001953 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1954 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 +02001955 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001956
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02001957 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001958 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001959
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001960 /* Send one UL block (with TLLI since we are in One-Phase Access
1961 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001962 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001963 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1964 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001965 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001966
1967 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02001968 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001969
1970 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001971}
1972
1973testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001974 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001975 f_TC_mt_ping_pong(omit, exp_cs_mcs);
1976}
1977
1978/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
1979/* information about the MS */
1980testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001981 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001982 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001983}
1984
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02001985/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
1986 * TBF, it will request retransmission through UL ACK/NACK (with missing block
1987 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
1988 * be transferred).
1989 */
1990testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02001991 var RlcmacDlBlock dl_block;
1992 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02001993 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02001994 var octetstring total_payload;
1995 var octetstring payload;
1996 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02001997 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001998 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001999 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002000
2001 /* Initialize NS/BSSGP side */
2002 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002003 /* Initialize GPRS MS side */
2004 f_init_gprs_ms();
2005 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002006
2007 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002008 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002009
2010 /* Establish BSSGP connection to the PCU */
2011 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002012 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002013
2014 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002015 f_ms_establish_ul_tbf(ms);
2016 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002017
2018 /* Send one UL block (with TLLI since we are in One-Phase Access
2019 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002020 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 +02002021 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002022
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002023 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2024 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002025 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002026 total_payload := payload;
2027
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002028 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2029
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002030 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002031 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002032 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002033 total_payload := total_payload & payload;
2034
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002035 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002036 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002037 total_payload := total_payload & payload;
2038
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002039 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002040 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 +02002041 total_payload := total_payload & lost_payload;
2042
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002043 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002044 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002045 total_payload := total_payload & payload;
2046
2047 /* 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 +02002048 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002049
2050 /* On CV=0, we'll receive a UL ACK asking about missing block */
2051 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2052 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002053 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2054 tfi := tfi,
2055 cv := 15,
2056 bsn := 3,
2057 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002058 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002059
2060 /* Now final ack is recieved */
2061 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2062 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002063 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002064
2065 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002066 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 +07002067
2068 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002069}
2070
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002071/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2072 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2073 * timeout occurs (specified by sent RRBP on DL block). */
2074testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002075 var RlcmacDlBlock dl_block;
2076 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002077 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002078 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002079
2080 /* Initialize NS/BSSGP side */
2081 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002082 /* Initialize GPRS MS side */
2083 f_init_gprs_ms();
2084 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002085
2086 /* Initialize the PCU interface abstraction */
2087 f_init_raw(testcasename());
2088
2089 /* Establish BSSGP connection to the PCU */
2090 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002091 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002092
2093 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002094 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2095 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002096
2097 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2098 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002099 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002100
2101 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2102 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2103 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002104 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002105
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002106 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2107 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002108 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002109
2110 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002111 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2112 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2113 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002114
2115 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002116}
2117
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002118/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2119testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2120 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2121 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002122 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002123 var RlcmacDlBlock dl_block;
2124 var uint32_t ack_fn;
2125 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002126 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002127 timer T := 5.0;
2128
2129 /* Initialize NS/BSSGP side */
2130 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002131 /* Initialize GPRS MS side */
2132 f_init_gprs_ms();
2133 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002134
2135 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002136 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002137
Daniel Willmann535aea62020-09-21 13:27:08 +02002138 f_statsd_reset();
2139
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002140 /* Establish BSSGP connection to the PCU */
2141 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002142 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002143
2144 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002145 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2146 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002147
2148 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2149 f_sleep(X2002);
2150
2151 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2152 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002153 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002154
2155 /* TDMA frame number on which we are supposed to send the ACK */
2156 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2157
2158 /* SGSN sends more blocks during the indicated RRBP */
2159 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2160 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002161 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002162
2163 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2164
2165 /* Make sure this block has the same TFI as was assigned
2166 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002167 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002168 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2169 dl_block.data.mac_hdr.hdr_ext.tfi);
2170 f_shutdown(__BFILE__, __LINE__);
2171 }
2172
2173 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002174 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002175
2176 /* Break if this is the end of RRBP */
2177 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002178 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002179 break;
2180 }
2181 }
2182
2183 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002184 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 +07002185
2186 /* Make sure that the next block (after the Ack) is dummy */
2187 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2188
Daniel Willmann535aea62020-09-21 13:27:08 +02002189 var StatsDExpects expect := {
2190 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2191 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2192 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2193 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2194 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002195 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002196 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2197 };
2198 f_statsd_expect(expect);
2199
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002200 f_shutdown(__BFILE__, __LINE__, final := true);
2201}
2202
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002203/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2204 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2205 * Check "3GPP TS 44.060" Annex B. */
2206testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2207 var RlcmacDlBlock dl_block;
2208 var octetstring dataA := f_rnd_octstring(20);
2209 var octetstring dataB := f_rnd_octstring(13);
2210 var octetstring dataC := f_rnd_octstring(3);
2211 var octetstring dataD := f_rnd_octstring(12);
2212 var uint32_t sched_fn;
2213 var GprsMS ms;
2214 var template (value) RlcmacUlBlock ul_data;
2215
2216 /* Initialize NS/BSSGP side */
2217 f_init_bssgp();
2218 /* Initialize GPRS MS side */
2219 f_init_gprs_ms();
2220 ms := g_ms[0]; /* We only use first MS in this test */
2221
2222 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002223 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002224
2225 /* Establish BSSGP connection to the PCU */
2226 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002227 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002228
2229 /* Establish an Uplink TBF */
2230 f_ms_establish_ul_tbf(ms);
2231
2232 /* Summary of what's transmitted:
2233 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2234 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2235 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2236 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2237 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2238 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2239 */
2240
2241 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002242 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2243 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002244 cv := 3,
2245 bsn := ms.ul_tbf.bsn,
2246 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2247 tlli := ms.tlli);
2248 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2249 * RLCMAC block being sent. */
2250 ul_data.data.mac_hdr.e := true;
2251 f_ultbf_inc_bsn(ms.ul_tbf);
2252 f_ms_tx_ul_block(ms, ul_data);
2253
2254 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002255 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2256 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002257 cv := 2,
2258 bsn := ms.ul_tbf.bsn,
2259 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2260 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2261 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2262 },
2263 tlli := ms.tlli);
2264 f_ultbf_inc_bsn(ms.ul_tbf);
2265 f_ms_tx_ul_block(ms, ul_data);
2266
2267 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002268 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 +02002269
2270 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002271 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2272 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002273 cv := 1,
2274 bsn := ms.ul_tbf.bsn,
2275 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2276 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2277 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2278 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2279 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2280 },
2281 tlli := ms.tlli);
2282 f_ultbf_inc_bsn(ms.ul_tbf);
2283 f_ms_tx_ul_block(ms, ul_data);
2284
2285 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002286 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2287 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 +02002288
2289 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002290 ul_data := t_RLCMAC_UL_DATA_TLLI(
2291 cs := CS_1,
2292 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002293 cv := 0,
2294 bsn := ms.ul_tbf.bsn,
2295 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2296 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2297 },
2298 tlli := ms.tlli);
2299 f_ultbf_inc_bsn(ms.ul_tbf);
2300 f_ms_tx_ul_block(ms, ul_data);
2301
2302 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002303 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 +02002304
2305 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2306 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2307 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2308
2309 f_shutdown(__BFILE__, __LINE__, final := true);
2310}
2311
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002312/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2313 * ACK/NACK is not answered */
2314testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2315 var RlcmacDlBlock dl_block;
2316 var octetstring data1 := f_rnd_octstring(200);
2317 var octetstring data2 := f_rnd_octstring(10);
2318 var uint32_t dl_fn;
2319 var GprsMS ms;
2320 var template (value) TsTrxBtsNum nr;
2321 var BTS_PDTCH_Block data_msg;
2322
2323 /* Initialize NS/BSSGP side */
2324 f_init_bssgp();
2325 /* Initialize GPRS MS side */
2326 f_init_gprs_ms();
2327 ms := g_ms[0]; /* We only use first MS in this test */
2328
2329 /* Initialize the PCU interface abstraction */
2330 f_init_raw(testcasename())
2331
2332 /* Establish BSSGP connection to the PCU */
2333 f_bssgp_establish();
2334 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2335
2336 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2337 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2338 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2339
2340 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2341 f_sleep(X2002);
2342
2343 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2344 while (true) {
2345 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2346
2347 /* Keep Ack/Nack description updated (except for last BSN) */
2348 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2349
2350 if (f_dl_block_rrbp_valid(dl_block)) {
2351 /* Don't transmit DL ACK here on purpose ignore it */
2352 break;
2353 }
2354 }
2355
2356 /* PCU starts whole process again */
2357 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2358
2359 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2360 f_sleep(X2002);
2361
2362 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2363 /* DL data), after that we receive only DUMMY blocks so we are done */
2364 var boolean data_received := false;
2365 nr := ts_TsTrxBtsNum;
2366 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2367 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2368 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2369 block_nr := nr.blk_nr));
2370 alt {
2371 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2372 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2373 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2374 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2375 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2376 tr_RLCMAC_DATA)) -> value data_msg {
2377 data_received := true;
2378 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2379 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2380 log("Received FINAL_ACK");
2381 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2382 }
2383 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2384 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2385 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2386 }
2387 nr := ts_TsTrxBtsNum;
2388 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2389 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2390 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2391 block_nr := nr.blk_nr));
2392 repeat;
2393 }
2394 [] BTS.receive {
2395 setverdict(fail, "Unexpected BTS message");
2396 f_shutdown(__BFILE__, __LINE__);
2397 }
2398 }
2399
2400 f_shutdown(__BFILE__, __LINE__, final := true);
2401}
2402
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002403/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2404testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002405 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002406 var octetstring data := f_rnd_octstring(10);
2407 var PacketDlAssign dl_tbf_ass;
2408 var RlcmacDlBlock dl_block;
2409 var uint32_t poll_fn;
2410 var uint32_t sched_fn;
2411 var GprsMS ms;
2412 timer T := 5.0;
2413
2414 /* Initialize NS/BSSGP side */
2415 f_init_bssgp();
2416 /* Initialize GPRS MS side */
2417 f_init_gprs_ms();
2418 ms := g_ms[0]; /* We only use first MS in this test */
2419
2420 /* Only 1 TRX with 8 PDCH */
2421 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11111111'B, 0);
2422 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2423
2424 /* Initialize the PCU interface abstraction */
2425 f_init_raw(testcasename(), info_ind);
2426
2427 /* Establish BSSGP connection to the PCU */
2428 f_bssgp_establish();
2429 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2430
2431 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2432 through PDCH (no multiblock assignment possible through PCH) */
2433 f_ms_establish_ul_tbf(ms);
2434
2435 /* Send one UL block (with TLLI since we are in One-Phase Access
2436 contention resoultion) and make sure it is ACKED fine */
2437 f_ms_tx_ul_data_block(ms, data, with_tlli := true, nr := f_ms_tx_TsTrxBtsNum(ms));
2438 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2439 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2440
2441 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2442 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2443 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2444 gprsextendeddynalloccap := '0'B
2445 };
2446 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2447 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2448 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2449 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2450 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2451 f_shutdown(__BFILE__, __LINE__);
2452 }
2453 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2454
2455 f_shutdown(__BFILE__, __LINE__, final := true);
2456}
2457
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002458testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002459 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002460 var RlcmacDlBlock dl_block;
2461 var octetstring data := f_rnd_octstring(10);
2462 var PollFnCtx pollctx;
2463 var uint32_t sched_fn;
2464 var GprsMS ms;
2465
2466 var MultislotCap_GPRS mscap_gprs := {
2467 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2468 gprsextendeddynalloccap := '0'B
2469 };
2470 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2471
2472
2473 /* Initialize NS/BSSGP side */
2474 f_init_bssgp();
2475 /* Initialize GPRS MS side */
2476 f_init_gprs_ms();
2477 ms := g_ms[0]; /* We only use first MS in this test */
2478
2479 /* Only 1 TRX with 8 PDCH */
2480 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11111111'B, 0);
2481 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2482
2483 /* Initialize the PCU interface abstraction */
2484 f_init_raw(testcasename(), info_ind);
2485
2486 /* Establish BSSGP connection to the PCU */
2487 f_bssgp_establish();
2488 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2489
2490 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2491 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2492
2493 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2494 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2495
2496 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2497 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2498 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2499 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2500 f_shutdown(__BFILE__, __LINE__);
2501 }
2502 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2503
2504 f_shutdown(__BFILE__, __LINE__, final := true);
2505}
2506
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002507testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2508 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2509 var RlcmacDlBlock dl_block;
2510 var octetstring data := f_rnd_octstring(10);
2511 var PollFnCtx pollctx;
2512 var uint32_t sched_fn;
2513 var GprsMS ms;
2514
2515 var MultislotCap_GPRS mscap_gprs := {
2516 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2517 gprsextendeddynalloccap := '0'B
2518 };
2519 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2520
2521
2522 /* Initialize NS/BSSGP side */
2523 f_init_bssgp();
2524 /* Initialize GPRS MS side */
2525 f_init_gprs_ms();
2526 ms := g_ms[0]; /* We only use first MS in this test */
2527
2528 /* Only 1 TRX with 8 PDCH */
2529 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11111111'B, 0);
2530 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2531
2532 /* Initialize the PCU interface abstraction */
2533 f_init_raw(testcasename(), info_ind);
2534
2535 /* Establish BSSGP connection to the PCU */
2536 f_bssgp_establish();
2537 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2538
2539 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2540 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2541
2542 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2543 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2544 f_shutdown(__BFILE__, __LINE__);
2545 }
2546
2547 f_shutdown(__BFILE__, __LINE__, final := true);
2548}
2549
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002550/* Test scenario where MS wants to request a new TBF once the current one is
2551 * ending, by means of sending a Packet Resource Request on ul slot provided by
2552 * last Pkt Ul ACK's RRBP.
2553 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2554testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002555 var RlcmacDlBlock dl_block;
2556 var octetstring data := f_rnd_octstring(10);
2557 var uint32_t sched_fn;
2558 var uint32_t dl_fn;
2559 var template RlcmacDlBlock acknack_tmpl;
2560 var GprsMS ms;
2561
2562 /* Initialize NS/BSSGP side */
2563 f_init_bssgp();
2564 /* Initialize GPRS MS side */
2565 f_init_gprs_ms();
2566 ms := g_ms[0]; /* We only use first MS in this test */
2567
2568 /* Initialize the PCU interface abstraction */
2569 f_init_raw(testcasename());
2570
2571 /* Establish BSSGP connection to the PCU */
2572 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002573 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002574
2575 /* Establish an Uplink TBF */
2576 f_ms_establish_ul_tbf(ms);
2577
2578 /* Send one UL block (with TLLI since we are in One-Phase Access
2579 contention resoultion) and make sure it is ACKED fine */
2580 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2581
2582 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002583 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002584
2585 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2586 tr_UlAckNackGprs(ms.tlli,
2587 tr_AckNackDescription(final_ack := '1'B),
2588 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2589 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2590
2591 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2592
2593 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002594 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 +07002595 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002596 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2597 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2598
2599 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2600 and make sure it is ACKED fine */
2601 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2602
2603 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002604 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002605
2606 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2607 /* ACK the ACK */
2608 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2609
2610 f_shutdown(__BFILE__, __LINE__, final := true);
2611}
2612
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002613/* Test CS paging over the BTS<->PCU socket.
2614 * 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.
2615 * Paging should be send on the PACCH.
2616 *
2617 * 1. Send a Paging Request over PCU socket.
2618 * 2. Send a Ready-To-Send message over PCU socket
2619 * 3. Expect a Paging Frame
2620 */
2621testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002622 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002623 var MobileIdentityLV mi;
2624 var octetstring mi_enc_lv;
2625 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002626 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002627
2628 /* Initialize NS/BSSGP side */
2629 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002630 /* Initialize GPRS MS side */
2631 f_init_gprs_ms();
2632 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002633
2634 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002635 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002636
2637 /* Establish BSSGP connection to the PCU */
2638 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002639 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002640
2641 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002642 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002643
2644 /* build mobile Identity */
2645 mi := valueof(ts_MI_IMSI_LV(imsi));
2646 mi_enc_lv := enc_MobileIdentityLV(mi);
2647 /* Send paging request */
2648 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2649 sapi :=PCU_IF_SAPI_PDTCH));
2650
2651 /* Receive it on BTS side towards MS */
2652 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2653
2654 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002655 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2656 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2657 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2658 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002659
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002660 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002661}
2662
2663/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2664 */
2665private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2666runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002667 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002668 var hexstring imsi := f_gen_imsi(42);
2669 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002670 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002671
2672 /* Initialize NS/BSSGP side */
2673 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002674 /* Initialize GPRS MS side */
2675 f_init_gprs_ms();
2676 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002677
2678 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002679 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002680
2681 /* Establish BSSGP connection to the PCU */
2682 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002683 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002684
2685 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002686 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002687
2688 /* Send paging request with or without TMSI */
2689 if (use_ptmsi) {
2690 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
2691 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
2692 } else {
2693 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
2694 }
2695
2696 /* Receive it on BTS side towards MS */
2697 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2698
2699 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002700 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002701 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002702 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
2703 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
2704 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002705 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002706 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2707 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2708 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002709 }
2710
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002711 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002712}
2713
2714testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2715 f_tc_paging_cs_from_sgsn(0, true);
2716}
2717
2718testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2719 f_tc_paging_cs_from_sgsn(0);
2720}
2721
2722testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002723 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002724}
2725
2726/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
2727 */
2728private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2729runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002730 var integer imsi_suff_tx := 423;
2731 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002732 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002733
2734 /* Initialize NS/BSSGP side */
2735 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002736 /* Initialize GPRS MS side */
2737 f_init_gprs_ms();
2738 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002739
2740 /* Initialize the PCU interface abstraction */
2741 f_init_raw(testcasename());
2742
2743 /* Establish BSSGP connection to the PCU */
2744 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002745 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002746
2747 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
2748 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
2749 if (use_ptmsi) {
2750 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
2751 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
2752 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
2753 } else {
2754 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
2755 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
2756 }
2757
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002758 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002759}
2760
2761testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2762 f_tc_paging_ps_from_sgsn(0, true);
2763}
2764
2765testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2766 f_tc_paging_ps_from_sgsn(0);
2767}
2768
2769testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002770 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002771}
2772
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002773/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
2774testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
2775 var RlcmacDlBlock dl_block;
2776 var octetstring data := f_rnd_octstring(10);
2777 var uint32_t sched_fn;
2778 var uint32_t dl_fn;
2779 var GprsMS ms;
2780
2781 /* Initialize NS/BSSGP side */
2782 f_init_bssgp();
2783 /* Initialize GPRS MS side */
2784 f_init_gprs_ms();
2785 ms := g_ms[0]; /* We only use first MS in this test */
2786
2787 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002788 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002789
Daniel Willmann535aea62020-09-21 13:27:08 +02002790 f_statsd_reset();
2791
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002792 /* Establish BSSGP connection to the PCU */
2793 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002794 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002795
2796 /* Establish an Uplink TBF */
2797 f_ms_establish_ul_tbf(ms);
2798
2799 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
2800 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2801 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2802 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2803 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2804
2805 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002806 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002807
2808 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
2809 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
2810 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2811
2812 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2813 f_sleep(X2002);
2814 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
2815
2816 /* ACK the DL block */
2817 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2818 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2819 f_dl_block_ack_fn(dl_block, dl_fn));
2820
Daniel Willmann535aea62020-09-21 13:27:08 +02002821 var StatsDExpects expect := {
2822 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
2823 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2824 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2825 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002826 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01002827 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02002828 };
2829 f_statsd_expect(expect);
2830
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002831 f_shutdown(__BFILE__, __LINE__, final := true);
2832}
2833
2834/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
2835testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
2836 var RlcmacDlBlock dl_block;
2837 var octetstring data := f_rnd_octstring(10);
2838 var uint32_t sched_fn;
2839 var uint32_t dl_fn;
2840 var GprsMS ms;
2841
2842 /* Initialize NS/BSSGP side */
2843 f_init_bssgp();
2844 /* Initialize GPRS MS side */
2845 f_init_gprs_ms();
2846 ms := g_ms[0]; /* We only use first MS in this test */
2847
2848 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002849 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002850
2851 /* Establish BSSGP connection to the PCU */
2852 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002853 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002854
2855 /* Establish an Uplink TBF */
2856 f_ms_establish_ul_tbf(ms);
2857
2858 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
2859 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2860 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2861 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2862 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2863
2864 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002865 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002866
2867 /* Now SGSN sends some DL data with an invalid IMSI */
2868 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
2869
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01002870 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002871
2872 /* TODO: make sure no data is sent over PCU -> MS */
2873
2874 f_shutdown(__BFILE__, __LINE__, final := true);
2875}
2876
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01002877private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
2878 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2879 var octetstring data := f_rnd_octstring(6);
2880 var RlcmacDlBlock dl_block;
2881 var GprsMS ms;
2882 var uint32_t fn;
2883
2884 /* Initialize NS/BSSGP side */
2885 f_init_bssgp();
2886 /* Initialize GPRS MS side */
2887 f_init_gprs_ms();
2888 ms := g_ms[0]; /* We only use first MS in this test */
2889
2890 /* Initialize the PCU interface abstraction */
2891 f_init_raw(testcasename());
2892
2893 /* Establish BSSGP connection to the PCU */
2894 f_bssgp_establish();
2895 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2896
2897 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2898 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2899 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2900
2901 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2902 f_sleep(X2002);
2903
2904 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2905 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
2906
2907 if (ischosen(dl_block.data_egprs)) {
2908 if (lengthof(dl_block.data_egprs.blocks) != 2) {
2909 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
2910 f_shutdown(__BFILE__, __LINE__);
2911 }
2912 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
2913 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
2914 f_shutdown(__BFILE__, __LINE__);
2915 }
2916 if (not match(dl_block.data_egprs.blocks[1].payload,
2917 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
2918 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
2919 f_shutdown(__BFILE__, __LINE__);
2920 }
2921 } else if (lengthof(dl_block.data.blocks) > 1) {
2922 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
2923 f_shutdown(__BFILE__, __LINE__);
2924 }
2925
2926 f_shutdown(__BFILE__, __LINE__, final := true);
2927}
2928
2929/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
2930 * containing llc data. See OS#4849 */
2931testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
2932 f_tc_dl_data_no_llc_ui_dummy(omit);
2933}
2934
2935/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
2936 * containing llc data. See OS#4849 */
2937testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002938 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01002939}
2940
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002941private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07002942 template GsmRrMessage t_imm_ass := ?,
2943 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002944runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07002945 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002946 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002947
2948 ra11 := enc_EGPRSPktChRequest2uint(req);
2949 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
2950
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07002951 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07002952 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002953 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002954 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002955 }
2956
2957 setverdict(pass);
2958}
2959
2960testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
2961 var template GsmRrMessage imm_ass;
2962 var template IaRestOctets rest;
2963 var template EgprsUlAss ul_ass;
2964
2965 /* Initialize the PCU interface abstraction */
2966 f_init_raw(testcasename());
2967
2968 var EGPRSPktChRequest req := {
2969 /* NOTE: other fields are set in the loop */
2970 signalling := { tag := '110011'B }
2971 };
2972
2973 for (var integer i := 0; i < 6; i := i + 1) {
2974 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
2975 req.signalling.random_bits := ext_ra;
2976
2977 /* For signalling, do we expect Multiblock UL TBF Assignment? */
2978 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
2979 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
2980 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
2981
2982 f_TC_egprs_pkt_chan_req(req, imm_ass);
2983 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002984
2985 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002986}
2987
2988testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
2989 var template GsmRrMessage imm_ass;
2990 var template IaRestOctets rest;
2991 var template EgprsUlAss ul_ass;
2992
2993 /* Initialize the PCU interface abstraction */
2994 f_init_raw(testcasename());
2995
2996 var EGPRSPktChRequest req := {
2997 /* NOTE: other fields are set in the loop */
2998 one_phase := { tag := '0'B }
2999 };
3000
3001 for (var integer i := 0; i < 6; i := i + 1) {
3002 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3003 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3004 var BIT2 priority := substr(ext_ra, 0, 2);
3005 var BIT3 rand := substr(ext_ra, 2, 3);
3006
3007 req.one_phase.multislot_class := mslot_class;
3008 req.one_phase.priority := priority;
3009 req.one_phase.random_bits := rand;
3010
3011 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3012 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3013 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3014 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3015
3016 f_TC_egprs_pkt_chan_req(req, imm_ass);
3017 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003018
3019 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003020}
3021
3022testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3023 var template GsmRrMessage imm_ass;
3024 var template IaRestOctets rest;
3025 var template EgprsUlAss ul_ass;
3026
3027 /* Initialize the PCU interface abstraction */
3028 f_init_raw(testcasename());
3029
3030 var EGPRSPktChRequest req := {
3031 /* NOTE: other fields are set in the loop */
3032 two_phase := { tag := '110000'B }
3033 };
3034
3035 for (var integer i := 0; i < 6; i := i + 1) {
3036 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3037 var BIT2 priority := substr(ext_ra, 0, 2);
3038 var BIT3 rand := substr(ext_ra, 2, 3);
3039
3040 req.two_phase.priority := priority;
3041 req.two_phase.random_bits := rand;
3042
3043 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3044 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3045 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3046 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3047
3048 f_TC_egprs_pkt_chan_req(req, imm_ass);
3049 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003050
3051 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003052}
3053
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003054private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3055 template IARRestOctets rest := ?,
3056 PCUIF_BurstType bt := BURST_TYPE_1)
3057runs on RAW_PCU_Test_CT {
3058 var template ReqRefWaitInd tr_ref;
3059 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003060
3061 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3062 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3063 ra := bit2int(ra11), is_11bit := 1,
3064 burst_type := bt, fn := fn,
3065 arfcn := 871));
3066
3067 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003068 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003069
3070 /* Just to have a short-name reference to the actual message */
3071 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3072
3073 /* Make sure that Request Reference list contains at least one entry
3074 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3075 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3076 if (not match(iar.payload, { *, tr_ref, * })) {
3077 setverdict(fail, "Request Reference list does not match");
3078 f_shutdown(__BFILE__, __LINE__);
3079 }
3080
3081 /* Match Feature Indicator (must indicate PS domain) */
3082 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3083 setverdict(fail, "Feature Indicator does not match");
3084 f_shutdown(__BFILE__, __LINE__);
3085 }
3086
3087 /* Match IAR Rest Octets */
3088 if (not match(iar.rest_octets, rest)) {
3089 setverdict(fail, "IAR Rest Octets does not match: ",
3090 iar.rest_octets, " vs expected ", rest);
3091 f_shutdown(__BFILE__, __LINE__);
3092 }
3093
3094 setverdict(pass);
3095}
3096
3097/* Verify the contents of RR Immediate Assignment Reject message and its
3098 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3099testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3100 var template IARRestOctets rest;
3101 var BIT5 ext_ra;
3102
3103 /* Initialize the PCU interface abstraction */
3104 f_init_raw(testcasename());
3105
3106 for (var integer i := 0; i < 6; i := i + 1) {
3107 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3108 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3109
3110 /* Intentionally incorrect message (see table 11.2.5a.2) */
3111 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3112 }
3113
3114 f_shutdown(__BFILE__, __LINE__, final := true);
3115}
3116
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003117/* At the moment, the IUT does not support any emergency services. Make sure
3118 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3119testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3120 var template IARRestOctets rest;
3121 var BIT5 ext_ra;
3122 var BIT11 ra11;
3123
3124 /* Initialize the PCU interface abstraction */
3125 f_init_raw(testcasename());
3126
3127 var EGPRSPktChRequest req := {
3128 /* NOTE: other fields are set in the loop */
3129 emergency := { tag := '110111'B }
3130 };
3131
3132 for (var integer i := 0; i < 6; i := i + 1) {
3133 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3134 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3135
3136 req.emergency.random_bits := ext_ra;
3137 ra11 := enc_EGPRSPktChRequest2bits(req);
3138
3139 /* Intentionally incorrect message (see table 11.2.5a.2) */
3140 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3141 }
3142
3143 f_shutdown(__BFILE__, __LINE__, final := true);
3144}
3145
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003146/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3147testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003148 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003149 var template IARRestOctets rest;
3150 var BIT11 ra11;
3151
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003152 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003153
3154 /* Only the first TRX is enabled. */
3155 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3156 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003157
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003158 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003159 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003160
3161 var EGPRSPktChRequest req := {
3162 one_phase := {
3163 tag := '0'B,
3164 multislot_class := '10101'B,
3165 priority := '01'B,
3166 random_bits := '101'B
3167 }
3168 };
3169
3170 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3171 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3172 for (var integer i := 0; i < 7; i := i + 1) {
3173 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3174 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3175 }
3176
3177 ra11 := enc_EGPRSPktChRequest2bits(req);
3178 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3179
3180 /* At this point, the IUT should run out of free USFs */
3181 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3182
3183 f_shutdown(__BFILE__, __LINE__, final := true);
3184}
3185
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003186/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003187private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003188return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003189 /* Pick a random MA length in range 2 .. max_ma_len */
3190 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3191
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003192 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3193 hsn := f_rnd_int(63),
3194 maio := f_rnd_int(63),
3195 ma := f_rnd_bitstring(ma_len));
3196}
3197
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003198private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3199 in GsmRrMessage rr_msg)
3200{
3201 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
3202 var PCUIF_InfoTrxTs ts := info_ind.trx.v10[0].ts[ia.pkt_chan_desc.tn];
3203
3204 var template PacketChannelDescription tr_pkt_chan_desc := {
3205 channel_Type_spare := ?,
3206 tn := ?,
3207 tsc := ts.tsc,
3208 presence := '1'B,
3209 zero := omit,
3210 one := {
3211 maio := ts.maio,
3212 hsn := ts.hsn
3213 }
3214 };
3215
3216 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3217 setverdict(fail, "Packet Channel Description does not match: ",
3218 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3219 }
3220
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003221 /* Mobile Allocation is expected to be octet-aligned */
3222 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3223 var template MobileAllocationLV tr_ma := {
3224 len := ma_oct_len, /* in bytes */
3225 ma := substr(ts.ma, 0, ma_oct_len * 8)
3226 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003227
3228 if (not match(ia.mobile_allocation, tr_ma)) {
3229 setverdict(fail, "Mobile Allocation does not match: ",
3230 ia.mobile_allocation, " vs ", tr_ma);
3231 }
3232
3233 setverdict(pass);
3234}
3235
3236/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3237testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003238 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003239 var GprsMS ms := valueof(t_GprsMS_def);
3240
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003241 /* Enable frequency hopping on TRX0/TS7 */
3242 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003243
3244 /* Initialize the PCU interface abstraction */
3245 f_init_raw(testcasename(), info_ind);
3246
3247 /* EGPRS Packet Channel Request (cause=Signalling) */
3248 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3249
3250 /* Establish an Uplink EGPRS TBF */
3251 f_ms_establish_ul_tbf(ms);
3252
3253 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3254 f_shutdown(__BFILE__, __LINE__, final := true);
3255}
3256
3257/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3258testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003259 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003260 var GprsMS ms := valueof(t_GprsMS_def);
3261
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003262 /* Enable frequency hopping on TRX0/TS7 */
3263 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003264
3265 /* Initialize the PCU interface abstraction */
3266 f_init_raw(testcasename(), info_ind);
3267
3268 /* Establish an Uplink TBF */
3269 f_ms_establish_ul_tbf(ms);
3270
3271 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3272 f_shutdown(__BFILE__, __LINE__, final := true);
3273}
3274
3275/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3276testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003277 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003278 var GprsMS ms := valueof(t_GprsMS_def);
3279
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003280 /* Enable frequency hopping on TRX0/TS7 */
3281 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003282
3283 /* Initialize NS/BSSGP side */
3284 f_init_bssgp();
3285
3286 /* Initialize the PCU interface abstraction */
3287 f_init_raw(testcasename(), info_ind);
3288
3289 /* Establish BSSGP connection to the PCU */
3290 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003291 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003292
3293 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3294 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3295 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3296
3297 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3298 f_shutdown(__BFILE__, __LINE__, final := true);
3299}
3300
3301private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3302 in FrequencyParameters fp)
3303{
3304 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
3305 var PCUIF_InfoTrxTs ts := info_ind.trx.v10[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003306
3307 /* Table 12.8.1: Frequency Parameters information elements */
3308 var template FrequencyParameters tr_fp := {
3309 tsc := ts.tsc,
3310 presence := '10'B, /* Direct encoding 1 */
3311 arfcn := omit,
3312 indirect := omit,
3313 direct1 := {
3314 maio := ts.maio,
3315 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3316 mobile_allocation := {
3317 hsn := ts.hsn,
3318 rfl_number_list_present := '0'B,
3319 rfl_number_list := omit,
3320 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003321 ma_length := ts.ma_bit_len,
3322 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003323 }
3324 },
3325 direct2 := omit
3326 };
3327
3328 if (not match(fp, tr_fp)) {
3329 setverdict(fail, "Frequency Parameters IE does not match: ",
3330 fp, " vs ", tr_fp);
3331 }
3332
3333 setverdict(pass);
3334}
3335
3336/* Make sure that Packet Uplink Assignment contains hopping parameters */
3337testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003338 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003339 var GprsMS ms := valueof(t_GprsMS_def);
3340 var uint32_t poll_fn;
3341
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003342 /* Enable frequency hopping on TRX0/TS7 */
3343 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003344
3345 /* Initialize the PCU interface abstraction */
3346 f_init_raw(testcasename(), info_ind);
3347
3348 /* Establish an Uplink TBF */
3349 f_ms_establish_ul_tbf(ms);
3350
3351 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
3352 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)));
3353
3354 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003355 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3356 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003357
3358 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3359 var template (omit) FrequencyParameters fp;
3360 if (ua.is_egprs == '1'B) {
3361 fp := ua.egprs.freq_par;
3362 } else {
3363 fp := ua.gprs.freq_par;
3364 }
3365
3366 /* This is an optional IE, so it's worth to check its presence */
3367 if (istemplatekind(fp, "omit")) {
3368 setverdict(fail, "Frequency Parameters IE is not present");
3369 f_shutdown(__BFILE__, __LINE__);
3370 }
3371
3372 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3373 f_shutdown(__BFILE__, __LINE__, final := true);
3374}
3375
3376/* Make sure that Packet Downlink Assignment contains hopping parameters */
3377testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003378 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003379 var octetstring data := f_rnd_octstring(10);
3380 var GprsMS ms := valueof(t_GprsMS_def);
3381 var RlcmacDlBlock dl_block;
3382 var uint32_t poll_fn;
3383
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003384 /* Enable frequency hopping on TRX0/TS7 */
3385 info_ind.trx.v10[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003386
3387 /* Initialize NS/BSSGP side */
3388 f_init_bssgp();
3389
3390 /* Initialize the PCU interface abstraction */
3391 f_init_raw(testcasename(), info_ind);
3392
3393 /* Establish BSSGP connection to the PCU */
3394 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003395 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003396
3397 /* Establish an Uplink TBF */
3398 f_ms_establish_ul_tbf(ms);
3399
3400 /* Send an Uplink block, so this TBF becomes "active" */
3401 f_ms_tx_ul_data_block(ms, data, with_tlli := true);
3402
3403 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3404 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3405 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3406
3407 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3408 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3409
3410 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003411 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3412 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003413
3414 /* This is an optional IE, so it's worth to check its presence */
3415 if (not ispresent(da.freq_par)) {
3416 setverdict(fail, "Frequency Parameters IE is not present");
3417 f_shutdown(__BFILE__, __LINE__);
3418 }
3419
3420 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3421 f_shutdown(__BFILE__, __LINE__, final := true);
3422}
3423
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003424/* Check if the IUT handles subsequent INFO.ind messages */
3425testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003426 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003427 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003428
3429 /* Initialize the PCU interface abstraction */
3430 f_init_raw(testcasename(), info_ind);
3431
3432 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3433 for (var integer i := 0; i < 16; i := i + 1) {
3434 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003435 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003436 }
3437
3438 f_shutdown(__BFILE__, __LINE__, final := true);
3439}
3440
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003441/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3442testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3443 var PCUIF_info_ind info_ind;
3444 var integer i;
3445 const integer num_ms := 8;
3446
3447 /* Initialize NS/BSSGP side */
3448 f_init_bssgp();
3449 /* Initialize GPRS MS side */
3450 f_init_gprs_ms(num_ms);
3451
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003452 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003453 /* Only the 3 first TRX are enabled. The enabled ones all have same
3454 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003455 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3456 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000011'B, 0);
3457 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00001100'B, 1);
3458 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003459
3460 /* Initialize the PCU interface abstraction */
3461 f_init_raw(testcasename(), info_ind);
3462
3463 /* Establish BSSGP connection to the PCU */
3464 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003465 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003466
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003467 /* Establish an Uplink TBF for each GprsMS instance */
3468 f_multi_ms_establish_tbf(do_activate := false);
3469
3470 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003471 for (i := 0; i < num_ms; i := i + 1) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003472 if (g_ms[i].ul_tbf.arfcn != info_ind.trx.v10[i mod 3].arfcn) {
3473 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
3474 " vs exp ", info_ind.trx.v10[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003475 f_shutdown(__BFILE__, __LINE__);
3476 }
3477 }
3478
3479 f_shutdown(__BFILE__, __LINE__, final := true);
3480}
3481
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003482/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3483 * downgraded to CS1-4 so that GPRS can read the USF).
3484 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3485 */
3486testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3487 var PCUIF_info_ind info_ind;
3488 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3489 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003490 var uint32_t sched_fn, dl_fn, ack_fn;
3491 var octetstring data := f_rnd_octstring(10);
3492 var RlcmacDlBlock dl_block;
3493 var integer tx_data_remain := 5;
3494 var integer tgt_ms;
3495 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3496 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3497
3498 /* Initialize NS/BSSGP side */
3499 f_init_bssgp();
3500 /* Initialize GPRS MS side */
3501 f_init_gprs_ms(num_ms);
3502
3503 info_ind := valueof(ts_PCUIF_INFO_default);
3504 /* Only use 1 PDCH to make sure both end up in the same slot: */
3505 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000001'B, 0);
3506 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3507
3508 /* Initialize the PCU interface abstraction */
3509 f_init_raw(testcasename(), info_ind);
3510
3511 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3512 g_mcs_initial_dl := 5;
3513 g_mcs_max_dl := 5;
3514 f_pcuvty_set_allowed_cs_mcs();
3515
3516 /* Establish BSSGP connection to the PCU */
3517 f_bssgp_establish();
3518 f_multi_ms_bssgp_register();
3519
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003520 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003521 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 +01003522 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3523 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3524 f_shutdown(__BFILE__, __LINE__);
3525 }
3526 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3527 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3528
3529 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003530 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 +01003531 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3532 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3533 f_shutdown(__BFILE__, __LINE__);
3534 }
3535 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3536 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3537
3538 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3539 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3540 f_sleep(0.1);
3541 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3542 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3543 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3544 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3545 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3546 /* ACK the DL block */
3547 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3548 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3549 f_dl_block_ack_fn(dl_block, dl_fn));
3550
3551 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3552 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3553 f_sleep(0.1);
3554 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3555 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3556 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3557 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3558 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3559 /* ACK the DL block */
3560 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3561 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3562 f_dl_block_ack_fn(dl_block, dl_fn));
3563
3564 data := f_rnd_octstring(1400);
3565 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3566 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3567
3568 for (var integer i := 0; i < 800; i := i + 1) {
3569 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3570
3571 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3572 /* No more data to receive, done */
3573 break;
3574 }
3575
3576 if (ischosen(dl_block.ctrl)) {
3577 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3578 f_shutdown(__BFILE__, __LINE__);
3579 } else if (ischosen(dl_block.data_egprs)) {
3580 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3581 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3582 f_shutdown(__BFILE__, __LINE__);
3583 }
3584 tgt_ms := 1;
3585 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3586 if (dl_block.data_egprs.mcs > MCS_4) {
3587 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3588 f_shutdown(__BFILE__, __LINE__);
3589 }
3590 ms_egprs_usf_count[0] := ms_egprs_usf_count[0] + 1;
3591 } else {
3592 if (dl_block.data_egprs.mcs <= MCS_4) {
3593 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3594 f_shutdown(__BFILE__, __LINE__);
3595 }
3596 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
3597 ms_egprs_usf_count[1] := ms_egprs_usf_count[1] + 1;
3598 }
3599 }
3600 } else {
3601 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3602 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3603 f_shutdown(__BFILE__, __LINE__);
3604 }
3605 tgt_ms := 0;
3606 if (match(dl_block.data.mac_hdr.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3607 ms_gprs_usf_count[0] := ms_gprs_usf_count[0] + 1;
3608 } else if (match(dl_block.data.mac_hdr.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
3609 ms_gprs_usf_count[1] := ms_gprs_usf_count[1] + 1;
3610 }
3611 }
3612
3613 /* Keep Ack/Nack description updated */
3614 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3615
3616 /* TDMA frame number on which we are supposed to send the ACK */
3617 if (f_dl_block_rrbp_valid(dl_block)) {
3618 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3619 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);
3620 if (tx_data_remain != 0) {
3621 /* Submit more data from time to time to keep the TBF ongoing */
3622 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3623 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3624 tx_data_remain := tx_data_remain - 1;
3625 }
3626 }
3627 }
3628
3629 log("results: ms_gprs_usf_count=", ms_gprs_usf_count, " / ms_egprs_usf_count=", ms_egprs_usf_count);
3630 if (ms_gprs_usf_count[0] == 0 or ms_gprs_usf_count[1] == 0 or
3631 ms_egprs_usf_count[0] == 0 or ms_egprs_usf_count[1] == 0) {
3632 setverdict(fail, "USF thresholds not met!");
3633 f_shutdown(__BFILE__, __LINE__);
3634 }
3635
3636 f_shutdown(__BFILE__, __LINE__, final := true);
3637}
3638
3639
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003640private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3641 boolean exp_imsi, boolean exp_tmsi)
3642runs on RAW_PCU_Test_CT {
3643 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
3644 var integer pending := lengthof(g_ms);
3645 var RlcmacDlBlock dl_block;
3646 var boolean f1, f2;
3647
3648 while (pending > 0) {
3649 var uint32_t poll_fn;
3650
3651 /* Obtain a Downlink block and make sure it is a paging request */
3652 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
3653 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
3654 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3655 break;
3656 }
3657
3658 /* This should not happen in general, but who knows... */
3659 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3660 if (not ispresent(req.repeated_pageinfo)) {
3661 setverdict(fail, "Repeated Page Info IE is absent?!?");
3662 break;
3663 }
3664
3665 /* A single message may contain several MIs depending on their type */
3666 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3667 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
3668 ps_domain := false);
3669 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
3670 ps_domain := false);
3671 if (not f1 and not f2)
3672 { continue; }
3673
3674 /* Detect duplicate MIs */
3675 if (mask[i] == '1'B) {
3676 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
3677 continue;
3678 }
3679
3680 mask[i] := '1'B;
3681 }
3682
3683 pending := pending - lengthof(req.repeated_pageinfo);
3684 }
3685
3686 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
3687 if (mask[i] != '1'B) {
3688 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
3689 log("===== mask := ", mask);
3690 }
3691 }
3692
3693 /* All messages must have been received by now, expect a dummy block */
3694 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
3695}
3696
3697private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
3698runs on RAW_PCU_Test_CT {
3699 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3700 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3701
3702 /* Initialize NS/BSSGP side */
3703 f_init_bssgp();
3704
3705 /* Explicitly set the given PDCH slot-mask to all transceivers */
3706 f_PCUIF_ver_INFO_PDCHMask_set(info_ind, pdch_mask);
3707
3708 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
3709 f_init_gprs_ms(7 * 8);
3710
3711 /* Initialize the PCU interface abstraction */
3712 f_init_raw(testcasename(), info_ind);
3713
3714 /* Establish BSSGP connection to the PCU */
3715 f_bssgp_establish();
3716 f_multi_ms_bssgp_register();
3717
3718 /* Establish an Uplink TBF for each GprsMS instance */
3719 f_multi_ms_establish_tbf(do_activate := true);
3720}
3721
3722testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
3723 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3724
3725 /* Common part: send INFO.ind, establish TBFs... */
3726 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3727
3728 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
3729 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3730 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3731 }
3732
3733 /* FIXME: work around a race condition between PCUIF and BSSGP */
3734 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3735
3736 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3737 * The IUT is expected to page on all PDCH slots of all transceivers. */
3738 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3739 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3740 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
3741 }
3742
3743 f_shutdown(__BFILE__, __LINE__, final := true);
3744}
3745
3746testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
3747 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3748
3749 /* Common part: send INFO.ind, establish TBFs... */
3750 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3751
3752 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
3753 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3754 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
3755 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
3756 }
3757
3758 /* FIXME: work around a race condition between PCUIF and BSSGP */
3759 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3760
3761 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3762 * The IUT is expected to page on all PDCH slots of all transceivers. */
3763 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3764 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3765 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
3766 }
3767
3768 f_shutdown(__BFILE__, __LINE__, final := true);
3769}
3770
3771testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
3772 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3773
3774 /* Common part: send INFO.ind, establish TBFs... */
3775 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3776
3777 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
3778 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3779 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
3780 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
3781 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
3782 } else {
3783 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3784 }
3785 }
3786
3787 /* FIXME: work around a race condition between PCUIF and BSSGP */
3788 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3789
3790 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3791 * The IUT is expected to page on all PDCH slots of all transceivers. */
3792 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3793 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3794 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
3795 }
3796
3797 f_shutdown(__BFILE__, __LINE__, final := true);
3798}
3799
Pau Espin Pedrola846e612021-02-01 19:25:25 +01003800private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003801runs on RAW_PCU_Test_CT return RlcmacDlBlock {
3802 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003803 var integer i := 0;
3804 while (true) {
3805 f_rx_rlcmac_dl_block(dl_block, sched_fn);
3806 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
3807 break;
3808 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01003809 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003810 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3811 f_shutdown(__BFILE__, __LINE__);
3812 }
3813 i := i + 1;
3814 }
3815 return dl_block;
3816}
3817
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01003818private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
3819runs on RAW_PCU_Test_CT {
3820 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),
3821 info_ind.lac),
3822 info_ind.rac),
3823 info_ind.cell_id));
3824 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
3825 423),
3826 2),
3827 5));
3828 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
3829 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
3830 var template (value) RAN_Information_RIM_Container res_cont :=
3831 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3832 ts_RIM_Sequence_Number(2),
3833 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3834 ts_RIM_Protocol_Version_Number(1),
3835 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
3836 omit);
3837 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3838 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3839 res_cont));
3840}
3841
3842altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
3843runs on RAW_PCU_Test_CT {
3844 /* RIM procedure: */
3845 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),
3846 info_ind.lac),
3847 info_ind.rac),
3848 info_ind.cell_id));
3849 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
3850 423),
3851 2),
3852 5));
3853 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
3854 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
3855 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3856 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3857 tr_RAN_Information_Request_RIM_Container)) {
3858 if (do_answer) {
3859 f_outbound_nacc_rim_tx_resp(info_ind);
3860 }
3861 if (do_repeat) {
3862 repeat;
3863 }
3864 }
3865}
3866
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003867/* Start NACC from MS side */
3868private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01003869 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
3870 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003871runs on RAW_PCU_Test_CT {
3872 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
3873 var RlcmacDlBlock dl_block;
3874 var uint32_t sched_fn;
3875 var GsmArfcn req_arfcn := 862;
3876 var uint6_t req_bsic := 43;
3877
3878 /* Start NACC from MS side */
3879 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
3880 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
3881
3882 if (exp_rac_ci_query == true) {
3883 /* osmo-pcu should now ask for resolution: */
3884 f_ipa_ctrl_wait_link_up();
3885 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
3886 int2str(info_ind.lac) & "." &
3887 int2str(info_ind.cell_id) & "." &
3888 int2str(req_arfcn) & "." &
3889 int2str(req_bsic);
3890 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
3891 }
3892
3893 if (exp_si_query == true) {
3894 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01003895 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003896 }
3897
3898 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01003899 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003900
3901 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
3902 f_rx_rlcmac_dl_block(dl_block, sched_fn);
3903 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
3904 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3905 f_shutdown(__BFILE__, __LINE__);
3906 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01003907 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01003908 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01003909 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
3910 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3911 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003912}
3913
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003914/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
3915testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003916 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003917 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003918 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003919
3920 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
3921 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
3922
3923 /* Initialize NS/BSSGP side */
3924 f_init_bssgp();
3925 /* Initialize GPRS MS side */
3926 f_init_gprs_ms();
3927 ms := g_ms[0]; /* We only use first MS in this test */
3928
3929 /* Initialize the PCU interface abstraction */
3930 f_init_raw(testcasename(), info_ind);
3931
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003932 /* Make sure we are not affected by full cache from previous tests */
3933 f_pcuvty_flush_neigh_caches();
3934
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003935 /* Establish BSSGP connection to the PCU */
3936 f_bssgp_establish();
3937 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3938
3939 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003940 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 +01003941 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3942 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3943
3944 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003945 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003946
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01003947 f_shutdown(__BFILE__, __LINE__, final := true);
3948}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01003949
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01003950/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
3951testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
3952 var PollFnCtx pollctx;
3953 var GprsMS ms;
3954 var RlcmacDlBlock dl_block;
3955 var uint32_t sched_fn;
3956 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01003957
3958 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
3959 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
3960
3961 /* Initialize NS/BSSGP side */
3962 f_init_bssgp();
3963 /* Initialize GPRS MS side */
3964 f_init_gprs_ms();
3965 ms := g_ms[0]; /* We only use first MS in this test */
3966
3967 /* Initialize the PCU interface abstraction */
3968 f_init_raw(testcasename(), info_ind);
3969
3970 /* Make sure we are not affected by full cache from previous tests */
3971 f_pcuvty_flush_neigh_caches();
3972
3973 /* Establish BSSGP connection to the PCU */
3974 f_bssgp_establish();
3975 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3976
3977 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003978 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 +01003979 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3980 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3981
3982 /* Start NACC from MS side, avoid sending final CTRL ACK */
3983 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
3984
3985 /* Wait until we receive something non-dummy */
3986 dl_block := f_skip_dummy(0, sched_fn);
3987 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
3988 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
3989 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3990 }
3991 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3992 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
3993 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
3994 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3995 }
3996
3997 f_shutdown(__BFILE__, __LINE__, final := true);
3998}
3999
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004000/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4001testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4002 var PollFnCtx pollctx;
4003 var GprsMS ms;
4004 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004005 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004006
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004007 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4008 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004009
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004010 /* Initialize NS/BSSGP side */
4011 f_init_bssgp();
4012 /* Initialize GPRS MS side */
4013 f_init_gprs_ms();
4014 ms := g_ms[0]; /* We only use first MS in this test */
4015
4016 /* Initialize the PCU interface abstraction */
4017 f_init_raw(testcasename(), info_ind);
4018
4019 /* Make sure we are not affected by full cache from previous tests */
4020 f_pcuvty_flush_neigh_caches();
4021 /* Set timeout values for caches so that entries will be in cache during second try */
4022 f_pcuvty_set_neigh_caches(10, 10);
4023
4024 /* Establish BSSGP connection to the PCU */
4025 f_bssgp_establish();
4026 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4027
4028 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004029 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 +01004030 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4031 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4032
4033 /* Start NACC from MS side */
4034 f_outbound_nacc_success(ms, info_ind);
4035
4036 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4037 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004038
4039 f_shutdown(__BFILE__, __LINE__, final := true);
4040}
4041
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004042/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4043 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4044 */
4045testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4046 var PollFnCtx pollctx;
4047 var GprsMS ms;
4048 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004049 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4050
4051 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4052 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4053
4054 /* Initialize NS/BSSGP side */
4055 f_init_bssgp();
4056 /* Initialize GPRS MS side */
4057 f_init_gprs_ms();
4058 ms := g_ms[0]; /* We only use first MS in this test */
4059
4060 /* Initialize the PCU interface abstraction */
4061 f_init_raw(testcasename(), info_ind);
4062
4063 /* Make sure we are not affected by full cache from previous tests */
4064 f_pcuvty_flush_neigh_caches();
4065 /* Set timeout values for caches so that entries will be erased before the second try */
4066 f_pcuvty_set_neigh_caches(1, 1);
4067
4068 /* Establish BSSGP connection to the PCU */
4069 f_bssgp_establish();
4070 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4071
4072 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004073 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 +01004074 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4075 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4076
4077 /* Start NACC from MS side */
4078 f_outbound_nacc_success(ms, info_ind);
4079
4080 /* CTRL client should have disconnected from us */
4081 f_ipa_ctrl_wait_link_down();
4082 /* wait for cache entries to time out */
4083 f_sleep(2.0);
4084 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4085 f_outbound_nacc_success(ms, info_ind);
4086
4087 f_shutdown(__BFILE__, __LINE__, final := true);
4088}
4089
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004090/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004091testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4092 var RlcmacDlBlock dl_block;
4093 var PollFnCtx pollctx;
4094 var uint32_t sched_fn;
4095 var GprsMS ms;
4096 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4097 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004098 var GsmArfcn req_arfcn := 862;
4099 var uint6_t req_bsic := 43;
4100
4101 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4102 * resolution CTRL port, to trigger Conn Refused by socket:
4103 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4104 */
4105
4106 /* Initialize NS/BSSGP side */
4107 f_init_bssgp();
4108 /* Initialize GPRS MS side */
4109 f_init_gprs_ms();
4110 ms := g_ms[0]; /* We only use first MS in this test */
4111
4112 /* Initialize the PCU interface abstraction */
4113 f_init_raw(testcasename(), info_ind);
4114
4115 /* Make sure we are not affected by full cache from previous tests */
4116 f_pcuvty_flush_neigh_caches();
4117
4118 /* Establish BSSGP connection to the PCU */
4119 f_bssgp_establish();
4120 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4121
4122 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004123 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 +01004124 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4125 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4126
4127 /* Start NACC from MS side */
4128 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4129 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4130
4131 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004132 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004133 /* Make sure it is a Pkt Cell Chg Continue */
4134 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4135 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4136 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004137 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4138 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4139 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4140 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4141 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004142
4143 f_shutdown(__BFILE__, __LINE__, final := true);
4144}
4145
4146/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004147testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4148 var RlcmacDlBlock dl_block;
4149 var PollFnCtx pollctx;
4150 var uint32_t sched_fn;
4151 var GprsMS ms;
4152 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4153 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004154 var GsmArfcn req_arfcn := 862;
4155 var uint6_t req_bsic := 43;
4156
4157 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4158 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4159
4160 /* Initialize NS/BSSGP side */
4161 f_init_bssgp();
4162 /* Initialize GPRS MS side */
4163 f_init_gprs_ms();
4164 ms := g_ms[0]; /* We only use first MS in this test */
4165
4166 /* Initialize the PCU interface abstraction */
4167 f_init_raw(testcasename(), info_ind);
4168
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004169 /* Make sure we are not affected by full cache from previous tests */
4170 f_pcuvty_flush_neigh_caches();
4171
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004172 /* Establish BSSGP connection to the PCU */
4173 f_bssgp_establish();
4174 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4175
4176 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004177 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 +01004178 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4179 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4180
4181 /* Start NACC from MS side */
4182 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4183 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4184
4185 /* osmo-pcu should now ask for resolution: */
4186 f_ipa_ctrl_wait_link_up();
4187 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4188 int2str(info_ind.lac) & "." &
4189 int2str(info_ind.cell_id) & "." &
4190 int2str(req_arfcn) & "." &
4191 int2str(req_bsic);
4192 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4193 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4194
4195 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004196 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004197 /* Make sure it is a Pkt Cell Chg Continue */
4198 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4199 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4200 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004201 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4202 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4203 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4204 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4205 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004206
4207 f_shutdown(__BFILE__, __LINE__, final := true);
4208}
4209
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004210/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4211testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() 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 Pedrol4b5227c2021-01-26 20:03:01 +01004218 var GsmArfcn req_arfcn := 862;
4219 var uint6_t req_bsic := 43;
4220
4221 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4222 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4223
4224 /* Initialize NS/BSSGP side */
4225 f_init_bssgp();
4226 /* Initialize GPRS MS side */
4227 f_init_gprs_ms();
4228 ms := g_ms[0]; /* We only use first MS in this test */
4229
4230 /* Initialize the PCU interface abstraction */
4231 f_init_raw(testcasename(), info_ind);
4232
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004233 /* Make sure we are not affected by full cache from previous tests */
4234 f_pcuvty_flush_neigh_caches();
4235
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004236 /* Establish BSSGP connection to the PCU */
4237 f_bssgp_establish();
4238 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4239
4240 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004241 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 +01004242 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4243 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4244
4245 /* Start NACC from MS side */
4246 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4247 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4248
4249 /* osmo-pcu should now ask for resolution: */
4250 f_ipa_ctrl_wait_link_up();
4251 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4252 int2str(info_ind.lac) & "." &
4253 int2str(info_ind.cell_id) & "." &
4254 int2str(req_arfcn) & "." &
4255 int2str(req_bsic);
4256 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4257 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4258
4259 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004260 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004261 /* Make sure it is a Pkt Cell Chg Continue */
4262 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4263 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4264 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004265 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4266 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4267 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4268 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4269 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004270
4271 f_shutdown(__BFILE__, __LINE__, final := true);
4272}
4273
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004274/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4275testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4276 var RlcmacDlBlock dl_block;
4277 var PollFnCtx pollctx;
4278 var uint32_t sched_fn;
4279 var GprsMS ms;
4280 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4281 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004282 var GsmArfcn req_arfcn := 862;
4283 var uint6_t req_bsic := 43;
4284 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 */
4285 info_ind.lac),
4286 info_ind.rac),
4287 info_ind.cell_id));
4288 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4289 423),
4290 2),
4291 5));
4292 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4293 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4294
4295 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4296 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4297
4298 /* Initialize NS/BSSGP side */
4299 f_init_bssgp();
4300 /* Initialize GPRS MS side */
4301 f_init_gprs_ms();
4302 ms := g_ms[0]; /* We only use first MS in this test */
4303
4304 /* Initialize the PCU interface abstraction */
4305 f_init_raw(testcasename(), info_ind);
4306
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004307 /* Make sure we are not affected by full cache from previous tests */
4308 f_pcuvty_flush_neigh_caches();
4309
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004310 /* Establish BSSGP connection to the PCU */
4311 f_bssgp_establish();
4312 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4313
4314 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004315 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 +01004316 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4317 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4318
4319 /* Start NACC from MS side */
4320 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4321 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4322
4323 /* osmo-pcu should now ask for resolution: */
4324 f_ipa_ctrl_wait_link_up();
4325 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4326 int2str(info_ind.lac) & "." &
4327 int2str(info_ind.cell_id) & "." &
4328 int2str(req_arfcn) & "." &
4329 int2str(req_bsic);
4330 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4331
4332 /* RIM procedure: */
4333 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4334 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4335 tr_RAN_Information_Request_RIM_Container));
4336 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4337
4338 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004339 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004340 /* Make sure it is a Pkt Cell Chg Continue */
4341 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4342 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4343 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004344 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4345 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4346 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4347 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4348 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004349
4350 f_shutdown(__BFILE__, __LINE__, final := true);
4351}
4352
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004353/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4354testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4355 var PollFnCtx pollctx;
4356 var GprsMS ms;
4357 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4358 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4359 var RlcmacDlBlock dl_block;
4360 var uint32_t sched_fn;
4361 var CtrlMessage rx_ctrl;
4362 var GsmArfcn req_arfcn := 862;
4363 var uint6_t req_bsic := 43;
4364
4365 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4366 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4367
4368 /* Initialize NS/BSSGP side */
4369 f_init_bssgp();
4370 /* Initialize GPRS MS side */
4371 f_init_gprs_ms();
4372 ms := g_ms[0]; /* We only use first MS in this test */
4373
4374 /* Initialize the PCU interface abstraction */
4375 f_init_raw(testcasename(), info_ind);
4376
4377 /* Make sure we are not affected by full cache from previous tests */
4378 f_pcuvty_flush_neigh_caches();
4379
4380 /* Establish BSSGP connection to the PCU */
4381 f_bssgp_establish();
4382 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4383
4384 /* Send PACKET RESOURCE REQUEST */
4385 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4386 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4387 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4388
4389 /* Start NACC from MS side */
4390 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4391 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4392
4393 /* osmo-pcu should now ask for resolution: */
4394 f_ipa_ctrl_wait_link_up();
4395 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4396 int2str(info_ind.lac) & "." &
4397 int2str(info_ind.cell_id) & "." &
4398 int2str(req_arfcn) & "." &
4399 int2str(req_bsic);
4400 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4401 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4402 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4403 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4404 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4405 timer T := 2.0;
4406 T.start;
4407 alt {
4408 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4409 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4410 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4411 f_shutdown(__BFILE__, __LINE__);
4412 }
4413 [] T.timeout {
4414 setverdict(pass);
4415 }
4416 }
4417
4418 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004419 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004420
4421 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4422 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4423 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4424 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4425 f_shutdown(__BFILE__, __LINE__);
4426 }
4427 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4428 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4429 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4430 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4431 }
4432
4433 f_shutdown(__BFILE__, __LINE__, final := true);
4434}
4435
4436/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4437testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4438 var PollFnCtx pollctx;
4439 var GprsMS ms;
4440 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4441 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4442 var RlcmacDlBlock dl_block;
4443 var uint32_t sched_fn;
4444 var CtrlMessage rx_ctrl;
4445 var GsmArfcn req_arfcn := 862;
4446 var uint6_t req_bsic := 43;
4447
4448 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4449 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4450
4451 /* Initialize NS/BSSGP side */
4452 f_init_bssgp();
4453 /* Initialize GPRS MS side */
4454 f_init_gprs_ms();
4455 ms := g_ms[0]; /* We only use first MS in this test */
4456
4457 /* Initialize the PCU interface abstraction */
4458 f_init_raw(testcasename(), info_ind);
4459
4460 /* Make sure we are not affected by full cache from previous tests */
4461 f_pcuvty_flush_neigh_caches();
4462
4463 /* Establish BSSGP connection to the PCU */
4464 f_bssgp_establish();
4465 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4466
4467 /* Send PACKET RESOURCE REQUEST */
4468 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4469 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4470 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4471
4472 /* Start NACC from MS side */
4473 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4474 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4475
4476 /* osmo-pcu should now ask for resolution: */
4477 f_ipa_ctrl_wait_link_up();
4478 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4479 int2str(info_ind.lac) & "." &
4480 int2str(info_ind.cell_id) & "." &
4481 int2str(req_arfcn) & "." &
4482 int2str(req_bsic);
4483 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4484 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4485 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4486 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4487 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4488 f_outbound_nacc_rim_tx_resp(info_ind);
4489 timer T := 1.0;
4490 T.start;
4491 alt {
4492 [] RIM.receive {
4493 setverdict(fail, "Received unexpected RIM message");
4494 f_shutdown(__BFILE__, __LINE__);
4495 }
4496 [] T.timeout {
4497 setverdict(pass);
4498 }
4499 }
4500
4501 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004502 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004503
4504 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4505 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4506 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4507 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4508 f_shutdown(__BFILE__, __LINE__);
4509 }
4510 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4511 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4512 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4513 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4514 }
4515
4516 f_shutdown(__BFILE__, __LINE__, final := true);
4517}
4518
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004519/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4520testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4521 var PollFnCtx pollctx;
4522 var GprsMS ms;
4523 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4524 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4525 var RlcmacDlBlock dl_block;
4526 var uint32_t sched_fn;
4527 var CtrlMessage rx_ctrl;
4528 var GsmArfcn req_arfcn := 862;
4529 var uint6_t req_bsic := 43;
4530
4531 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4532 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4533
4534 /* Initialize NS/BSSGP side */
4535 f_init_bssgp();
4536 /* Initialize GPRS MS side */
4537 f_init_gprs_ms();
4538 ms := g_ms[0]; /* We only use first MS in this test */
4539
4540 /* Initialize the PCU interface abstraction */
4541 f_init_raw(testcasename(), info_ind);
4542
4543 /* Make sure we are not affected by full cache from previous tests */
4544 f_pcuvty_flush_neigh_caches();
4545
4546 /* Establish BSSGP connection to the PCU */
4547 f_bssgp_establish();
4548 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4549
4550 /* Send PACKET RESOURCE REQUEST */
4551 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4552 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4553 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4554
4555 /* Start NACC from MS side */
4556 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4557 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4558
4559 /* osmo-pcu should now ask for resolution: */
4560 f_ipa_ctrl_wait_link_up();
4561 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4562 int2str(info_ind.lac) & "." &
4563 int2str(info_ind.cell_id) & "." &
4564 int2str(req_arfcn) & "." &
4565 int2str(req_bsic);
4566 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4567 /* RIM procedure: */
4568 as_outbound_nacc_rim_resolve(info_ind);
4569
4570 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4571 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4572 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4573
4574 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4575 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4576
4577 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4578 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4579 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4580 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4581 f_shutdown(__BFILE__, __LINE__);
4582 }
4583 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4584 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4585 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4586 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4587 }
4588}
4589
4590/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4591testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4592 var PollFnCtx pollctx;
4593 var GprsMS ms;
4594 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4595 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4596 var RlcmacDlBlock dl_block;
4597 var uint32_t sched_fn;
4598 var CtrlMessage rx_ctrl;
4599 var GsmArfcn req_arfcn := 862;
4600 var uint6_t req_bsic := 43;
4601
4602 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4603 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4604
4605 /* Initialize NS/BSSGP side */
4606 f_init_bssgp();
4607 /* Initialize GPRS MS side */
4608 f_init_gprs_ms();
4609 ms := g_ms[0]; /* We only use first MS in this test */
4610
4611 /* Initialize the PCU interface abstraction */
4612 f_init_raw(testcasename(), info_ind);
4613
4614 /* Make sure we are not affected by full cache from previous tests */
4615 f_pcuvty_flush_neigh_caches();
4616
4617 /* Establish BSSGP connection to the PCU */
4618 f_bssgp_establish();
4619 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4620
4621 /* Send PACKET RESOURCE REQUEST */
4622 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4623 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4624 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4625
4626 /* Start NACC from MS side */
4627 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4628 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4629
4630 /* osmo-pcu should now ask for resolution: */
4631 f_ipa_ctrl_wait_link_up();
4632 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4633 int2str(info_ind.lac) & "." &
4634 int2str(info_ind.cell_id) & "." &
4635 int2str(req_arfcn) & "." &
4636 int2str(req_bsic);
4637 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4638 /* RIM procedure: */
4639 as_outbound_nacc_rim_resolve(info_ind);
4640
4641 /* Announce SI back to MS, continue NACC procedure */
4642 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4643
4644 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4645 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4646
4647 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4648 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4649 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4650 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4651 f_shutdown(__BFILE__, __LINE__);
4652 }
4653 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4654 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4655 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4656 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4657 }
4658}
4659
4660/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
4661testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
4662 var PollFnCtx pollctx;
4663 var GprsMS ms;
4664 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4665 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4666 var RlcmacDlBlock dl_block;
4667 var uint32_t sched_fn;
4668 var CtrlMessage rx_ctrl;
4669 var GsmArfcn req_arfcn := 862;
4670 var uint6_t req_bsic := 43;
4671
4672 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4673 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4674
4675 /* Initialize NS/BSSGP side */
4676 f_init_bssgp();
4677 /* Initialize GPRS MS side */
4678 f_init_gprs_ms();
4679 ms := g_ms[0]; /* We only use first MS in this test */
4680
4681 /* Initialize the PCU interface abstraction */
4682 f_init_raw(testcasename(), info_ind);
4683
4684 /* Make sure we are not affected by full cache from previous tests */
4685 f_pcuvty_flush_neigh_caches();
4686
4687 /* Establish BSSGP connection to the PCU */
4688 f_bssgp_establish();
4689 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4690
4691 /* Send PACKET RESOURCE REQUEST */
4692 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4693 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4694 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4695
4696 /* Start NACC from MS side */
4697 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4698 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4699
4700 /* osmo-pcu should now ask for resolution: */
4701 f_ipa_ctrl_wait_link_up();
4702 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4703 int2str(info_ind.lac) & "." &
4704 int2str(info_ind.cell_id) & "." &
4705 int2str(req_arfcn) & "." &
4706 int2str(req_bsic);
4707 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4708 /* RIM procedure: */
4709 as_outbound_nacc_rim_resolve(info_ind);
4710
4711 /* Announce SI back to MS, continue NACC procedure */
4712 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4713
4714 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4715 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4716 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4717 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4718 f_shutdown(__BFILE__, __LINE__);
4719 }
4720 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4721 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4722
4723 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4724 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4725 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4726 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4727 }
4728}
4729
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004730/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4731 * while waiting for CTRL resolution */
4732testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
4733 var PollFnCtx pollctx;
4734 var GprsMS ms;
4735 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4736 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4737 var RlcmacDlBlock dl_block;
4738 var uint32_t sched_fn;
4739 var CtrlMessage rx_ctrl;
4740 var GsmArfcn req_arfcn := 862;
4741 var uint6_t req_bsic := 43;
4742
4743 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4744 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4745
4746 /* Initialize NS/BSSGP side */
4747 f_init_bssgp();
4748 /* Initialize GPRS MS side */
4749 f_init_gprs_ms();
4750 ms := g_ms[0]; /* We only use first MS in this test */
4751
4752 /* Initialize the PCU interface abstraction */
4753 f_init_raw(testcasename(), info_ind);
4754
4755 /* Make sure we are not affected by full cache from previous tests */
4756 f_pcuvty_flush_neigh_caches();
4757
4758 /* Establish BSSGP connection to the PCU */
4759 f_bssgp_establish();
4760 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4761
4762 /* Send PACKET RESOURCE REQUEST */
4763 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4764 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4765 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4766
4767 /* Start NACC from MS side */
4768 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4769 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4770
4771 /* osmo-pcu should now ask for resolution: */
4772 f_ipa_ctrl_wait_link_up();
4773 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4774 int2str(info_ind.lac) & "." &
4775 int2str(info_ind.cell_id) & "." &
4776 int2str(req_arfcn) & "." &
4777 int2str(req_bsic);
4778 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4779 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
4780 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
4781 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4782 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4783 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4784 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
4785 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4786 int2str(info_ind.lac) & "." &
4787 int2str(info_ind.cell_id) & "." &
4788 int2str(req_arfcn + 1) & "." &
4789 int2str(req_bsic + 1);
4790 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4791
4792 /* And finally everything continues as usual with RIN procedure */
4793 as_outbound_nacc_rim_resolve(info_ind);
4794
4795 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004796 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004797
4798 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4799 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4800 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4801 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4802 f_shutdown(__BFILE__, __LINE__);
4803 }
4804 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4805 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4806 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4807 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4808 }
4809
4810 f_shutdown(__BFILE__, __LINE__, final := true);
4811}
4812
4813/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4814 * while waiting for SI resolution */
4815testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
4816 var PollFnCtx pollctx;
4817 var GprsMS ms;
4818 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4819 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4820 var RlcmacDlBlock dl_block;
4821 var uint32_t sched_fn;
4822 var CtrlMessage rx_ctrl;
4823 var GsmArfcn req_arfcn := 862;
4824 var uint6_t req_bsic := 43;
4825
4826 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4827 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4828
4829 /* Initialize NS/BSSGP side */
4830 f_init_bssgp();
4831 /* Initialize GPRS MS side */
4832 f_init_gprs_ms();
4833 ms := g_ms[0]; /* We only use first MS in this test */
4834
4835 /* Initialize the PCU interface abstraction */
4836 f_init_raw(testcasename(), info_ind);
4837
4838 /* Make sure we are not affected by full cache from previous tests */
4839 f_pcuvty_flush_neigh_caches();
4840
4841 /* Establish BSSGP connection to the PCU */
4842 f_bssgp_establish();
4843 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4844
4845 /* Send PACKET RESOURCE REQUEST */
4846 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4847 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4848 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4849
4850 /* Start NACC from MS side */
4851 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4852 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4853
4854 /* osmo-pcu should now ask for resolution: */
4855 f_ipa_ctrl_wait_link_up();
4856 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4857 int2str(info_ind.lac) & "." &
4858 int2str(info_ind.cell_id) & "." &
4859 int2str(req_arfcn) & "." &
4860 int2str(req_bsic);
4861 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4862 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4863 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
4864 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
4865 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4866 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4867 f_outbound_nacc_rim_tx_resp(info_ind);
4868
4869 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
4870 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4871 int2str(info_ind.lac) & "." &
4872 int2str(info_ind.cell_id) & "." &
4873 int2str(req_arfcn + 1) & "." &
4874 int2str(req_bsic + 1);
4875 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4876
4877 /* And finally everything continues as usual with RIN procedure */
4878 as_outbound_nacc_rim_resolve(info_ind);
4879
4880 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004881 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004882
4883 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4884 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4885 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4886 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4887 f_shutdown(__BFILE__, __LINE__);
4888 }
4889 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4890 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4891 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4892 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4893 }
4894
4895 f_shutdown(__BFILE__, __LINE__, final := true);
4896}
4897
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01004898/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4899 * while sending Pkt Neigh Data Change */
4900testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
4901 var PollFnCtx pollctx;
4902 var GprsMS ms;
4903 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4904 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4905 var RlcmacDlBlock dl_block;
4906 var uint32_t sched_fn;
4907 var CtrlMessage rx_ctrl;
4908 var GsmArfcn req_arfcn := 862;
4909 var uint6_t req_bsic := 43;
4910
4911 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4912 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4913
4914 /* Initialize NS/BSSGP side */
4915 f_init_bssgp();
4916 /* Initialize GPRS MS side */
4917 f_init_gprs_ms();
4918 ms := g_ms[0]; /* We only use first MS in this test */
4919
4920 /* Initialize the PCU interface abstraction */
4921 f_init_raw(testcasename(), info_ind);
4922
4923 /* Make sure we are not affected by full cache from previous tests */
4924 f_pcuvty_flush_neigh_caches();
4925
4926 /* Establish BSSGP connection to the PCU */
4927 f_bssgp_establish();
4928 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4929
4930 /* Send PACKET RESOURCE REQUEST */
4931 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4932 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4933 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4934
4935 /* Start NACC from MS side */
4936 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4937 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4938
4939 /* osmo-pcu should now ask for resolution: */
4940 f_ipa_ctrl_wait_link_up();
4941 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4942 int2str(info_ind.lac) & "." &
4943 int2str(info_ind.cell_id) & "." &
4944 int2str(req_arfcn) & "." &
4945 int2str(req_bsic);
4946 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4947 /* RIM procedure: */
4948 as_outbound_nacc_rim_resolve(info_ind);
4949
4950 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
4951 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4952 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
4953 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4954
4955 /* It should trigger RAC_CI resolution to start again: */
4956 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4957 int2str(info_ind.lac) & "." &
4958 int2str(info_ind.cell_id) & "." &
4959 int2str(req_arfcn + 1) & "." &
4960 int2str(req_bsic + 1);
4961 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4962 /* RIM procedure: */
4963 as_outbound_nacc_rim_resolve(info_ind);
4964 /* Transmit SI back to MS */
4965 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4966
4967 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4968 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4969 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4970 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4971 f_shutdown(__BFILE__, __LINE__);
4972 }
4973 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4974 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4975 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4976 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4977 }
4978}
4979
4980/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
4981testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
4982 var PollFnCtx pollctx;
4983 var GprsMS ms;
4984 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4985 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4986 var RlcmacDlBlock dl_block;
4987 var uint32_t sched_fn;
4988 var CtrlMessage rx_ctrl;
4989 var GsmArfcn req_arfcn := 862;
4990 var uint6_t req_bsic := 43;
4991
4992 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4993 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4994
4995 /* Initialize NS/BSSGP side */
4996 f_init_bssgp();
4997 /* Initialize GPRS MS side */
4998 f_init_gprs_ms();
4999 ms := g_ms[0]; /* We only use first MS in this test */
5000
5001 /* Initialize the PCU interface abstraction */
5002 f_init_raw(testcasename(), info_ind);
5003
5004 /* Make sure we are not affected by full cache from previous tests */
5005 f_pcuvty_flush_neigh_caches();
5006
5007 /* Establish BSSGP connection to the PCU */
5008 f_bssgp_establish();
5009 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5010
5011 /* Send PACKET RESOURCE REQUEST */
5012 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5013 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5014 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5015
5016 /* Start NACC from MS side */
5017 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5018 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5019
5020 /* osmo-pcu should now ask for resolution: */
5021 f_ipa_ctrl_wait_link_up();
5022 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5023 int2str(info_ind.lac) & "." &
5024 int2str(info_ind.cell_id) & "." &
5025 int2str(req_arfcn) & "." &
5026 int2str(req_bsic);
5027 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5028 /* RIM procedure: */
5029 as_outbound_nacc_rim_resolve(info_ind);
5030
5031 /* Announce SI back to MS, continue NACC procedure */
5032 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5033
5034 /* trigger a Pkt Cell Change Notif with different tgt cell */
5035 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5036 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5037
5038 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5039 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5040
5041 /* It should trigger RAC_CI resolution to start again: */
5042 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5043 int2str(info_ind.lac) & "." &
5044 int2str(info_ind.cell_id) & "." &
5045 int2str(req_arfcn + 1) & "." &
5046 int2str(req_bsic + 1);
5047 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5048 /* RIM procedure: */
5049 as_outbound_nacc_rim_resolve(info_ind);
5050 /* Transmit SI back to MS */
5051 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5052
5053 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5054 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5055 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5056 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5057 f_shutdown(__BFILE__, __LINE__);
5058 }
5059 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5060 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5061 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5062 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5063 }
5064}
5065
5066/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5067testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5068 var PollFnCtx pollctx;
5069 var GprsMS ms;
5070 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5071 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5072 var RlcmacDlBlock dl_block;
5073 var uint32_t sched_fn;
5074 var CtrlMessage rx_ctrl;
5075 var GsmArfcn req_arfcn := 862;
5076 var uint6_t req_bsic := 43;
5077
5078 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5079 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5080
5081 /* Initialize NS/BSSGP side */
5082 f_init_bssgp();
5083 /* Initialize GPRS MS side */
5084 f_init_gprs_ms();
5085 ms := g_ms[0]; /* We only use first MS in this test */
5086
5087 /* Initialize the PCU interface abstraction */
5088 f_init_raw(testcasename(), info_ind);
5089
5090 /* Make sure we are not affected by full cache from previous tests */
5091 f_pcuvty_flush_neigh_caches();
5092
5093 /* Establish BSSGP connection to the PCU */
5094 f_bssgp_establish();
5095 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5096
5097 /* Send PACKET RESOURCE REQUEST */
5098 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5099 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5100 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5101
5102 /* Start NACC from MS side */
5103 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5104 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5105
5106 /* osmo-pcu should now ask for resolution: */
5107 f_ipa_ctrl_wait_link_up();
5108 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5109 int2str(info_ind.lac) & "." &
5110 int2str(info_ind.cell_id) & "." &
5111 int2str(req_arfcn) & "." &
5112 int2str(req_bsic);
5113 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5114 /* RIM procedure: */
5115 as_outbound_nacc_rim_resolve(info_ind);
5116
5117 /* Announce SI back to MS, continue NACC procedure */
5118 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5119
5120 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5121 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5122 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5123 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5124 f_shutdown(__BFILE__, __LINE__);
5125 }
5126
5127 /* trigger a Pkt Cell Change Notif with different tgt cell */
5128 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5129 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5130
5131 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5132 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5133 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5134 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5135 }
5136 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5137 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5138
5139 /* It should trigger RAC_CI resolution to start again: */
5140 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5141 int2str(info_ind.lac) & "." &
5142 int2str(info_ind.cell_id) & "." &
5143 int2str(req_arfcn + 1) & "." &
5144 int2str(req_bsic + 1);
5145 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5146 /* RIM procedure: */
5147 as_outbound_nacc_rim_resolve(info_ind);
5148 /* Transmit SI back to MS */
5149 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5150
5151 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5152 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5153 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5154 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5155 f_shutdown(__BFILE__, __LINE__);
5156 }
5157 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5158 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5159 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5160 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5161 }
5162}
5163
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005164/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5165testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5166 var PollFnCtx pollctx;
5167 var GprsMS ms;
5168 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5169 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5170 var RlcmacDlBlock dl_block;
5171 var uint32_t sched_fn, dl_fn;
5172 var CtrlMessage rx_ctrl;
5173 var GsmArfcn req_arfcn := 862;
5174 var uint6_t req_bsic := 43;
5175 var octetstring data := f_rnd_octstring(10);
5176
5177 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5178 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5179
5180 /* Initialize NS/BSSGP side */
5181 f_init_bssgp();
5182 /* Initialize GPRS MS side */
5183 f_init_gprs_ms();
5184 ms := g_ms[0]; /* We only use first MS in this test */
5185
5186 /* Initialize the PCU interface abstraction */
5187 f_init_raw(testcasename(), info_ind);
5188
5189 /* Make sure we are not affected by full cache from previous tests */
5190 f_pcuvty_flush_neigh_caches();
5191
5192 /* Establish BSSGP connection to the PCU */
5193 f_bssgp_establish();
5194 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5195
5196 /* Send PACKET RESOURCE REQUEST */
5197 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5198 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5199 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5200
5201 /* Start NACC from MS side */
5202 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5203 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5204
5205 /* osmo-pcu should now ask for resolution: */
5206 f_ipa_ctrl_wait_link_up();
5207 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5208 int2str(info_ind.lac) & "." &
5209 int2str(info_ind.cell_id) & "." &
5210 int2str(req_arfcn) & "." &
5211 int2str(req_bsic);
5212 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5213 /* RIM procedure: */
5214 as_outbound_nacc_rim_resolve(info_ind);
5215
5216 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5217 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5218 f_sleep(0.1);
5219 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5220 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5221
5222 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5223 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5224 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5225 * Data with unassigned DL TBF in line above): */
5226 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5227 /* Continue receiving Pkt Cell Neighbor Data */
5228 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5229
5230 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5231 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5232 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5233 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5234 f_shutdown(__BFILE__, __LINE__);
5235 }
5236 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5237 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5238 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5239 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5240 }
5241
5242 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5243 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5244 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5245 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5246 f_dl_block_ack_fn(dl_block, dl_fn));
5247}
5248
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005249/* Send a RIM RAN info request to the PCU and verify the response, we expect
5250 * getting the system information back which we have transfered to the PCU via
5251 * PCUIF on startup. */
5252testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5253 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005254 timer T := 2.0;
5255
5256 /* Initialize NS/BSSGP side */
5257 f_init_bssgp();
5258
5259 /* Initialize the PCU interface abstraction */
5260 f_init_raw(testcasename());
5261
5262 /* Establish BSSGP connection to the PCU */
5263 f_bssgp_establish();
5264
5265 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005266 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 +01005267 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005268 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 +01005269 BTS.send(si3_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005270 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 +01005271 BTS.send(si16_data_ind);
5272 f_sleep(1.0);
5273
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005274 var RIM_Routing_Address dst_addr;
5275 var RIM_Routing_Address src_addr;
5276 var template (value) RAN_Information_Request_RIM_Container req_cont;
5277 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005278 var template PDU_BSSGP bssgp_rim_pdu_expect;
5279 var template RAN_Information_RIM_Container rim_cont_expect;
5280
5281 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 +01005282 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5283 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005284
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005285 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5286 ts_RIM_Sequence_Number(1),
5287 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5288 ts_RIM_Protocol_Version_Number(1),
5289 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5290 omit);
5291 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5292 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5293 req_cont);
5294
5295 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5296 tr_RIM_Sequence_Number(1),
5297 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5298 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005299 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 +01005300 omit);
5301
5302 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5303 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5304 rim_cont_expect);
5305 RIM.send(bssgp_rim_pdu);
5306 T.start;
5307 alt {
5308 [] RIM.receive(bssgp_rim_pdu_expect) { }
5309 [] RIM.receive {
5310 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5311 }
5312 [] T.timeout {
5313 setverdict(fail, "No BSSGP RIM PDU received");
5314 mtc.stop;
5315 }
5316 }
5317
5318 f_shutdown(__BFILE__, __LINE__, final := true);
5319}
5320
5321/* Same as above, but in this case we simulate the rare case in which the PCU
5322 * has no system information available. We expect getting a response back but
5323 * with no system information inside. */
5324testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005325 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005326 var PCUIF_Message pcu_msg;
5327 timer T := 2.0;
5328
5329 /* Initialize NS/BSSGP side */
5330 f_init_bssgp();
5331
5332 /* Initialize the PCU interface abstraction */
5333 f_init_raw(testcasename(), info_ind);
5334
5335 /* Establish BSSGP connection to the PCU */
5336 f_bssgp_establish();
5337
5338 /* Clear sysinfo from the PCU */
5339 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);
5340 BTS.send(si1_data_ind);
5341 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);
5342 BTS.send(si3_data_ind);
5343 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);
5344 BTS.send(si16_data_ind);
5345 f_sleep(1.0);
5346
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005347 var RIM_Routing_Address dst_addr;
5348 var RIM_Routing_Address src_addr;
5349 var template (value) RAN_Information_Request_RIM_Container req_cont;
5350 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005351 var template PDU_BSSGP bssgp_rim_pdu_expect;
5352 var template RAN_Information_RIM_Container rim_cont_expect;
5353
5354 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 +01005355 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5356 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005357
5358 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5359 ts_RIM_Sequence_Number(1),
5360 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5361 ts_RIM_Protocol_Version_Number(1),
5362 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5363 omit);
5364 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5365 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5366 req_cont);
5367
5368
5369 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5370 tr_RIM_Sequence_Number(1),
5371 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5372 tr_RIM_Protocol_Version_Number(1),
5373 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5374 omit);
5375
5376 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5377 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5378 rim_cont_expect);
5379 RIM.send(bssgp_rim_pdu);
5380 T.start;
5381 alt {
5382 [] RIM.receive(bssgp_rim_pdu_expect) { }
5383 [] RIM.receive {
5384 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5385 }
5386 [] T.timeout {
5387 setverdict(fail, "No BSSGP RIM PDU received");
5388 mtc.stop;
5389 }
5390 }
5391
5392 f_shutdown(__BFILE__, __LINE__, final := true);
5393}
5394
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005395control {
5396 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005397 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005398 execute( TC_ta_ptcch_idle() );
5399 execute( TC_ta_rach_imm_ass() );
5400 execute( TC_ta_idle_dl_tbf_ass() );
5401 execute( TC_ta_ptcch_ul_multi_tbf() );
5402 execute( TC_cs_lqual_ul_tbf() );
5403 execute( TC_cs_initial_ul() );
5404 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005405 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005406 execute( TC_cs_max_dl() );
5407 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005408 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005409 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005410 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005411 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005412 execute( TC_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005413 execute( TC_x2031_t3191() );
5414 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005415 execute( TC_t3193() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005416 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005417 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005418 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005419 execute( TC_mo_ping_pong() );
5420 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005421 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005422 execute( TC_mt_ping_pong() );
5423 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005424 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005425 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005426 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005427 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005428 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005429 execute( TC_paging_cs_from_bts() );
5430 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5431 execute( TC_paging_cs_from_sgsn_sign() );
5432 execute( TC_paging_cs_from_sgsn_ptp() );
5433 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5434 execute( TC_paging_ps_from_sgsn_sign() );
5435 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005436 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5437 execute( TC_paging_cs_multi_ms_imsi() );
5438 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005439 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5440 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005441 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5442 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005443
5444 /* EGPRS specific test cases */
5445 execute( TC_egprs_pkt_chan_req_signalling() );
5446 execute( TC_egprs_pkt_chan_req_one_phase() );
5447 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005448 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005449 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005450 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005451
5452 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005453
5454 /* Frequency hopping specific test cases */
5455 if (PCUIF_Types.mp_pcuif_version >= 10) {
5456 /* Immediate Assignment on AGCH/PCH */
5457 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5458 execute( TC_pcuif_fh_imm_ass_ul() );
5459 execute( TC_pcuif_fh_imm_ass_dl() );
5460 /* Packet Uplink/Downlink Assignment on PACCH */
5461 execute( TC_pcuif_fh_pkt_ass_ul() );
5462 execute( TC_pcuif_fh_pkt_ass_dl() );
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02005463 execute( TC_multitrx_multims_alloc() );
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01005464 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01005465 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01005466 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005467 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005468 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005469
5470 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005471 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005472 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005473 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005474 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005475 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005476 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005477 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005478 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005479 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5480 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005481 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5482 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5483 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005484 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5485 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005486 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5487 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5488 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005489 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005490
5491 execute( TC_rim_ran_info_req_single_rep() );
5492 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005493}
5494
Harald Weltea419df22019-03-21 17:23:04 +01005495}