blob: 3b840525a1972fa34a202e7512b87f491c42bbcd [file] [log] [blame]
Vadim Yanitskiy73878132021-05-05 02:22:45 +02001module BTS_Tests_VAMOS {
2
3/* Integration Tests for OsmoBTS
4 *
Vadim Yanitskiy47b32462023-05-18 18:58:40 +07005 * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
Vadim Yanitskiy73878132021-05-05 02:22:45 +02006 * Author: Vadim Yanitskiy <vyanitskiy@sysmocom.de>
7 *
8 * All rights reserved.
9 *
10 * Released under the terms of GNU General Public License, Version 2 or
11 * (at your option) any later version.
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * This module contains VAMOS specific test cases.
16 */
17
18import from Misc_Helpers all;
19import from General_Types all;
20import from Osmocom_Types all;
21import from GSM_Types all;
22import from L1CTL_PortType all;
23import from L1CTL_Types all;
24import from LAPDm_Types all;
25import from IPA_Emulation all;
26import from GSM_RR_Types all;
27import from L3_Templates all;
28
29import from RSL_Emulation all;
30import from RSL_Types all;
31
32import from BTS_Tests all;
33
34private type record of ChanNrModeSet ChanNrModeTest;
35private type record of ChanNrMode ChanNrModeSet;
36private type record ChanNrMode {
37 RslChannelNr chan_nr,
38 RSL_IE_ChannelMode chan_mode
39};
40
41/* VFF: V0(TCH/F) & V1(TCH/F), 2 channels total */
42private template (value) ChanNrModeTest
43ChanNrModeTestVFF(uint3_t tn) := {
44 {
45 { ts_RslChanNr_Bm(tn), /* V0(TCH/F), signalling */
46 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_F_VAMOS) },
47 { ts_RslChanNr_Osmo_VAMOS_Bm(tn), /* V1(TCH/F), signalling */
48 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_F_VAMOS) }
49 },
50 {
51 { ts_RslChanNr_Bm(tn), /* V0(TCH/F), FR codec */
52 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_F_VAMOS, RSL_CMOD_SP_GSM1) },
53 { ts_RslChanNr_Osmo_VAMOS_Bm(tn), /* V1(TCH/F), signalling */
54 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_F_VAMOS) }
55 },
56 {
57 { ts_RslChanNr_Bm(tn), /* V0(TCH/F), EFR codec */
58 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_F_VAMOS, RSL_CMOD_SP_GSM2) },
59 { ts_RslChanNr_Osmo_VAMOS_Bm(tn), /* V1(TCH/F), AMR codec */
60 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_F_VAMOS, RSL_CMOD_SP_GSM3) }
61 },
62 {
63 { ts_RslChanNr_Bm(tn), /* V0(TCH/F), AMR codec */
64 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_F_VAMOS, RSL_CMOD_SP_GSM3) },
65 { ts_RslChanNr_Osmo_VAMOS_Bm(tn), /* V1(TCH/F), AMR codec */
66 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_F_VAMOS, RSL_CMOD_SP_GSM3) }
67 }
68};
69
70/* VHH: V0(TCH/H0) & V1(TCH/H0) + V0(TCH/H1) & V1(TCH/H1), 4 channels total */
71private template (value) ChanNrModeTest
72ChanNrModeTestVHH(uint3_t tn) := {
73 {
74 { ts_RslChanNr_Lm(tn, 0), /* V0(TCH/H0), signalling */
75 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) },
76 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), signalling */
77 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) },
78 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 0), /* V1(TCH/H0), signalling */
79 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) },
80 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), signalling */
81 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) }
82 },
83 {
84 { ts_RslChanNr_Lm(tn, 0), /* V0(TCH/H0), signalling */
85 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) },
86 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), HR codec */
87 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM1) },
88 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 0), /* V1(TCH/H0), HR codec */
89 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM1) },
90 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), signalling */
91 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) }
92 },
93 {
94 { ts_RslChanNr_Lm(tn, 0), /* V0(TCH/H0), HR codec */
95 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM1) },
96 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), AMR codec */
97 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) },
98 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 0), /* V1(TCH/H0), signalling */
99 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) },
100 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), signalling */
101 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) }
102 },
103 {
104 { ts_RslChanNr_Lm(tn, 0), /* V0(TCH/H0), AMR codec */
105 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) },
106 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), AMR codec */
107 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) },
108 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 0), /* V1(TCH/H0), AMR codec */
109 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) },
110 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), AMR codec */
111 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) }
112 }
113};
114
115/* HVHH: TCH/H0 + V0(TCH/H1) & V1(TCH/H1), 3 channels total (mixed) */
116private template (value) ChanNrModeTest
117ChanNrModeTestHVHH(uint3_t tn) := {
118 {
119 { ts_RslChanNr_Lm(tn, 0), /* TCH/H0, signalling */
120 ts_RSL_ChanMode_SIGN(RSL_CHRT_TCH_H) },
121 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), signalling */
122 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) },
123 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), signalling */
124 ts_RSL_ChanMode_SIGN(RSL_CHRT_OSMO_TCH_H_VAMOS) }
125 },
126 {
127 { ts_RslChanNr_Lm(tn, 0), /* TCH/H0, signalling */
128 ts_RSL_ChanMode_SIGN(RSL_CHRT_TCH_H) },
129 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), AMR codec */
130 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) },
131 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), AMR codec */
132 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) }
133 },
134 {
135 { ts_RslChanNr_Lm(tn, 0), /* TCH/H0, HR codec */
136 ts_RSL_ChanMode(RSL_CHRT_TCH_H, RSL_CMOD_SP_GSM1) },
137 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), HR codec */
138 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM1) },
139 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), AMR codec */
140 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) }
141 },
142 {
143 { ts_RslChanNr_Lm(tn, 0), /* TCH/H0, AMR codec */
144 ts_RSL_ChanMode(RSL_CHRT_TCH_H, RSL_CMOD_SP_GSM3) },
145 { ts_RslChanNr_Lm(tn, 1), /* V0(TCH/H1), AMR codec */
146 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) },
147 { ts_RslChanNr_Osmo_VAMOS_Lm(tn, 1), /* V1(TCH/H1), AMR codec */
148 ts_RSL_ChanMode(RSL_CHRT_OSMO_TCH_H_VAMOS, RSL_CMOD_SP_GSM3) }
149 }
150};
151
152private template (value) RSL_IE
153ts_RSL_IE_OsmoTSC := {
154 iei := RSL_IE_OSMO_TRAINING_SEQUENCE,
155 body := {
156 osmo_training_sequence := {
157 len := 0, /* overridden */
158 tsc_set := f_rnd_int(4),
159 tsc := f_rnd_int(8)
160 }
161 }
162}
163
164private function f_TC_vamos_exec_async(in ChanNrModeTest test, void_fn handler)
165runs on test_CT {
166 /* Up to 4 simultenious lchans */
167 var ConnHdlrPars pars[4];
168 var ConnHdlr vc_conn[4];
169
170 f_init();
171
172 for (var integer i := 0; i < lengthof(test); i := i + 1) {
173 /* Start a ConnHdlr component for each logical channel */
174 for (var integer ch := 0; ch < lengthof(test[i]); ch := ch + 1) {
175 pars[ch] := valueof(t_Pars(test[i][ch].chan_nr,
176 test[i][ch].chan_mode));
Oliver Smith0033b122023-02-28 13:30:53 +0100177 if (ischosen(test[i][ch].chan_mode.u.speech) and test[i][ch].chan_mode.u.speech == RSL_CMOD_SP_GSM3) {
Vadim Yanitskiyfcce7052022-09-14 15:07:23 +0700178 pars[ch].mr_conf := valueof(ts_RSL_MultirateCfg);
Pau Espin Pedrolbcf135a2022-09-08 13:20:43 +0200179 }
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200180 vc_conn[ch] := f_start_handler(handler, pars[ch], l1ctl := false);
181 }
182
183 /* Wait for all ConnHdlr components to finish */
184 for (var integer ch := 0; ch < lengthof(test[i]); ch := ch + 1) {
185 vc_conn[ch].done;
186 }
187 }
Vadim Yanitskiybeda6972021-06-21 12:50:07 +0200188
189 Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200190}
191
192private function f_TC_vamos_chan_act(charstring id)
193runs on ConnHdlr {
194 var RSL_IE tsc_ie := valueof(ts_RSL_IE_OsmoTSC);
195
196 /* CHANnel ACTIVation with Osmocom specific TSC IE */
197 f_rsl_chan_act(g_pars.chan_mode, more_ies := { tsc_ie });
198
199 /* Hold the channel for a while */
200 f_sleep(0.3);
201
202 /* DEACTivate the channel */
203 f_rsl_chan_deact();
204 f_rslem_unregister(0, g_chan_nr);
205}
206
207/* VFF: V0(TCH/F) & V1(TCH/F), 2 channels total */
208testcase TC_vamos_chan_act_vff() runs on test_CT { /* TCH/F on TS1 */
209 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(1));
210 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
211}
212testcase TC_vamos_chan_act_dyn_ipa_vff() runs on test_CT { /* TCH/F+PDCH on TS3 */
213 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(3));
214 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
215}
216testcase TC_vamos_chan_act_dyn_osmo_vff() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
217 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(4));
218 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
219}
220
221/* VHH: V0(TCH/H0) & V1(TCH/H0) + V0(TCH/H1) & V1(TCH/H1), 4 channels total */
222testcase TC_vamos_chan_act_vhh() runs on test_CT {
223 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(5));
224 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act)); /* TCH/H on TS5 */
225}
226testcase TC_vamos_chan_act_dyn_osmo_vhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
227 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(4));
228 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
229}
230
231/* HVHH: TCH/H0 + V0(TCH/H1) & V1(TCH/H1), 3 channels total (mixed) */
232testcase TC_vamos_chan_act_hvhh() runs on test_CT {
233 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(5));
234 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act)); /* TCH/H on TS5 */
235}
236testcase TC_vamos_chan_act_dyn_osmo_hvhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
237 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(4));
238 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
239}
240
Vadim Yanitskiy4c58c6a2021-05-31 20:04:56 +0200241private function f_TC_vamos_chan_mode_modify(charstring id)
242runs on ConnHdlr {
243 var RSL_IE tsc_ie := valueof(ts_RSL_IE_OsmoTSC);
244
245 /* CHANnel ACTIVation with Osmocom specific IEs */
246 f_rsl_chan_act(g_pars.chan_mode, more_ies := { tsc_ie });
247
248 /* If we're in signalling mode, modify to speech */
249 if (g_pars.chan_mode.spd_ind == RSL_SPDI_SIGN) {
250 g_pars.chan_mode.spd_ind := RSL_SPDI_SPEECH;
Oliver Smith0033b122023-02-28 13:30:53 +0100251 g_pars.chan_mode.u.speech := RSL_CMOD_SP_GSM1;
Vadim Yanitskiy4c58c6a2021-05-31 20:04:56 +0200252 } else { /* ... or vice versa */
253 g_pars.chan_mode.spd_ind := RSL_SPDI_SIGN;
Oliver Smith0033b122023-02-28 13:30:53 +0100254 g_pars.chan_mode.u.sign := RSL_CMOD_NO_RESOURCE;
Vadim Yanitskiy4c58c6a2021-05-31 20:04:56 +0200255 }
256
257 var RSL_Message rsl := valueof(ts_RSL_MODE_MODIFY_REQ(g_chan_nr, g_pars.chan_mode));
258 rsl.ies := rsl.ies & { tsc_ie };
259 RSL.send(rsl);
260
261 timer T := 1.0;
262 T.start;
263 alt {
264 [] RSL.receive(tr_RSL_MODE_MODIFY_ACK(g_chan_nr)) { setverdict(pass); }
265 [] RSL.receive(tr_RSL_MODE_MODIFY_NACK(g_chan_nr, ?)) {
266 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
267 "Rx MODE MODIFY NACK");
268 }
269 [] T.timeout {
270 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
271 "Timeout waiting for MODE MODIFY (N)ACK");
272 }
273 }
274
275 /* DEACTivate the channel */
276 f_rsl_chan_deact();
277 f_rslem_unregister(0, g_chan_nr);
278}
279
280/* VFF: V0(TCH/F) & V1(TCH/F), 2 channels total */
281testcase TC_vamos_chan_mode_modify_vff() runs on test_CT { /* TCH/F on TS1 */
282 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(1));
283 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
284}
285testcase TC_vamos_chan_mode_modify_dyn_ipa_vff() runs on test_CT { /* TCH/F+PDCH on TS3 */
286 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(3));
287 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
288}
289testcase TC_vamos_chan_mode_modify_dyn_osmo_vff() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
290 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(4));
291 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
292}
293
294/* VHH: V0(TCH/H0) & V1(TCH/H0) + V0(TCH/H1) & V1(TCH/H1), 4 channels total */
295testcase TC_vamos_chan_mode_modify_vhh() runs on test_CT {
296 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(5));
297 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify)); /* TCH/H on TS5 */
298}
299testcase TC_vamos_chan_mode_modify_dyn_osmo_vhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
300 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(4));
301 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
302}
303
304/* HVHH: TCH/H0 + V0(TCH/H1) & V1(TCH/H1), 3 channels total (mixed) */
305testcase TC_vamos_chan_mode_modify_hvhh() runs on test_CT {
306 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(5));
307 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify)); /* TCH/H on TS5 */
308}
309testcase TC_vamos_chan_mode_modify_dyn_osmo_hvhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
310 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(4));
311 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
312}
313
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200314control {
315 /* CHANnel ACTIVation tests */
316 execute( TC_vamos_chan_act_vff() );
317 execute( TC_vamos_chan_act_vhh() );
318 execute( TC_vamos_chan_act_hvhh() );
319 execute( TC_vamos_chan_act_dyn_ipa_vff() );
320 execute( TC_vamos_chan_act_dyn_osmo_vff() );
321 execute( TC_vamos_chan_act_dyn_osmo_vhh() );
322 execute( TC_vamos_chan_act_dyn_osmo_hvhh() );
Vadim Yanitskiy4c58c6a2021-05-31 20:04:56 +0200323
324 /* MODE MODIFY tests */
325 execute( TC_vamos_chan_mode_modify_vff() );
326 execute( TC_vamos_chan_mode_modify_vhh() );
327 execute( TC_vamos_chan_mode_modify_hvhh() );
328 execute( TC_vamos_chan_mode_modify_dyn_ipa_vff() );
329 execute( TC_vamos_chan_mode_modify_dyn_osmo_vff() );
330 execute( TC_vamos_chan_mode_modify_dyn_osmo_vhh() );
331 execute( TC_vamos_chan_mode_modify_dyn_osmo_hvhh() );
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200332}
333
334}