blob: 3498c61aa2ab469d1cdc2c34b992bdf9b53ccdeb [file] [log] [blame]
Vadim Yanitskiy73878132021-05-05 02:22:45 +02001module BTS_Tests_VAMOS {
2
3/* Integration Tests for OsmoBTS
4 *
5 * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
6 * 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));
177 vc_conn[ch] := f_start_handler(handler, pars[ch], l1ctl := false);
178 }
179
180 /* Wait for all ConnHdlr components to finish */
181 for (var integer ch := 0; ch < lengthof(test[i]); ch := ch + 1) {
182 vc_conn[ch].done;
183 }
184 }
Vadim Yanitskiybeda6972021-06-21 12:50:07 +0200185
186 Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200187}
188
189private function f_TC_vamos_chan_act(charstring id)
190runs on ConnHdlr {
191 var RSL_IE tsc_ie := valueof(ts_RSL_IE_OsmoTSC);
192
193 /* CHANnel ACTIVation with Osmocom specific TSC IE */
194 f_rsl_chan_act(g_pars.chan_mode, more_ies := { tsc_ie });
195
196 /* Hold the channel for a while */
197 f_sleep(0.3);
198
199 /* DEACTivate the channel */
200 f_rsl_chan_deact();
201 f_rslem_unregister(0, g_chan_nr);
202}
203
204/* VFF: V0(TCH/F) & V1(TCH/F), 2 channels total */
205testcase TC_vamos_chan_act_vff() runs on test_CT { /* TCH/F on TS1 */
206 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(1));
207 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
208}
209testcase TC_vamos_chan_act_dyn_ipa_vff() runs on test_CT { /* TCH/F+PDCH on TS3 */
210 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(3));
211 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
212}
213testcase TC_vamos_chan_act_dyn_osmo_vff() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
214 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(4));
215 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
216}
217
218/* VHH: V0(TCH/H0) & V1(TCH/H0) + V0(TCH/H1) & V1(TCH/H1), 4 channels total */
219testcase TC_vamos_chan_act_vhh() runs on test_CT {
220 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(5));
221 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act)); /* TCH/H on TS5 */
222}
223testcase TC_vamos_chan_act_dyn_osmo_vhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
224 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(4));
225 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
226}
227
228/* HVHH: TCH/H0 + V0(TCH/H1) & V1(TCH/H1), 3 channels total (mixed) */
229testcase TC_vamos_chan_act_hvhh() runs on test_CT {
230 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(5));
231 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act)); /* TCH/H on TS5 */
232}
233testcase TC_vamos_chan_act_dyn_osmo_hvhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
234 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(4));
235 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_act));
236}
237
Vadim Yanitskiy4c58c6a2021-05-31 20:04:56 +0200238private function f_TC_vamos_chan_mode_modify(charstring id)
239runs on ConnHdlr {
240 var RSL_IE tsc_ie := valueof(ts_RSL_IE_OsmoTSC);
241
242 /* CHANnel ACTIVation with Osmocom specific IEs */
243 f_rsl_chan_act(g_pars.chan_mode, more_ies := { tsc_ie });
244
245 /* If we're in signalling mode, modify to speech */
246 if (g_pars.chan_mode.spd_ind == RSL_SPDI_SIGN) {
247 g_pars.chan_mode.spd_ind := RSL_SPDI_SPEECH;
248 g_pars.chan_mode.coding_alg_rate := RSL_CMOD_SP_GSM1;
249 } else { /* ... or vice versa */
250 g_pars.chan_mode.spd_ind := RSL_SPDI_SIGN;
251 g_pars.chan_mode.coding_alg_rate := RSL_CMOD_NO_RESOURCE;
252 }
253
254 var RSL_Message rsl := valueof(ts_RSL_MODE_MODIFY_REQ(g_chan_nr, g_pars.chan_mode));
255 rsl.ies := rsl.ies & { tsc_ie };
256 RSL.send(rsl);
257
258 timer T := 1.0;
259 T.start;
260 alt {
261 [] RSL.receive(tr_RSL_MODE_MODIFY_ACK(g_chan_nr)) { setverdict(pass); }
262 [] RSL.receive(tr_RSL_MODE_MODIFY_NACK(g_chan_nr, ?)) {
263 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
264 "Rx MODE MODIFY NACK");
265 }
266 [] T.timeout {
267 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
268 "Timeout waiting for MODE MODIFY (N)ACK");
269 }
270 }
271
272 /* DEACTivate the channel */
273 f_rsl_chan_deact();
274 f_rslem_unregister(0, g_chan_nr);
275}
276
277/* VFF: V0(TCH/F) & V1(TCH/F), 2 channels total */
278testcase TC_vamos_chan_mode_modify_vff() runs on test_CT { /* TCH/F on TS1 */
279 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(1));
280 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
281}
282testcase TC_vamos_chan_mode_modify_dyn_ipa_vff() runs on test_CT { /* TCH/F+PDCH on TS3 */
283 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(3));
284 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
285}
286testcase TC_vamos_chan_mode_modify_dyn_osmo_vff() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
287 var ChanNrModeTest test := valueof(ChanNrModeTestVFF(4));
288 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
289}
290
291/* VHH: V0(TCH/H0) & V1(TCH/H0) + V0(TCH/H1) & V1(TCH/H1), 4 channels total */
292testcase TC_vamos_chan_mode_modify_vhh() runs on test_CT {
293 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(5));
294 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify)); /* TCH/H on TS5 */
295}
296testcase TC_vamos_chan_mode_modify_dyn_osmo_vhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
297 var ChanNrModeTest test := valueof(ChanNrModeTestVHH(4));
298 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
299}
300
301/* HVHH: TCH/H0 + V0(TCH/H1) & V1(TCH/H1), 3 channels total (mixed) */
302testcase TC_vamos_chan_mode_modify_hvhh() runs on test_CT {
303 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(5));
304 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify)); /* TCH/H on TS5 */
305}
306testcase TC_vamos_chan_mode_modify_dyn_osmo_hvhh() runs on test_CT { /* TCH/F+TCH/H+PDCH on TS4 */
307 var ChanNrModeTest test := valueof(ChanNrModeTestHVHH(4));
308 f_TC_vamos_exec_async(test, refers(f_TC_vamos_chan_mode_modify));
309}
310
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200311control {
312 /* CHANnel ACTIVation tests */
313 execute( TC_vamos_chan_act_vff() );
314 execute( TC_vamos_chan_act_vhh() );
315 execute( TC_vamos_chan_act_hvhh() );
316 execute( TC_vamos_chan_act_dyn_ipa_vff() );
317 execute( TC_vamos_chan_act_dyn_osmo_vff() );
318 execute( TC_vamos_chan_act_dyn_osmo_vhh() );
319 execute( TC_vamos_chan_act_dyn_osmo_hvhh() );
Vadim Yanitskiy4c58c6a2021-05-31 20:04:56 +0200320
321 /* MODE MODIFY tests */
322 execute( TC_vamos_chan_mode_modify_vff() );
323 execute( TC_vamos_chan_mode_modify_vhh() );
324 execute( TC_vamos_chan_mode_modify_hvhh() );
325 execute( TC_vamos_chan_mode_modify_dyn_ipa_vff() );
326 execute( TC_vamos_chan_mode_modify_dyn_osmo_vff() );
327 execute( TC_vamos_chan_mode_modify_dyn_osmo_vhh() );
328 execute( TC_vamos_chan_mode_modify_dyn_osmo_hvhh() );
Vadim Yanitskiy73878132021-05-05 02:22:45 +0200329}
330
331}