blob: 4b65b3ea416790aaf19a9d46d1ad050dffe83c72 [file] [log] [blame]
Harald Welte56db5fd2017-07-14 18:25:59 +02001module Test {
Harald Welteaf549412017-07-15 21:33:21 +02002 import from GSM_Types all;
Harald Weltef0a49972017-07-16 03:55:20 +02003 import from Osmocom_Types all;
Harald Welte56db5fd2017-07-14 18:25:59 +02004 import from GSM_SystemInformation all;
Harald Welteb622a3d2017-07-14 22:26:33 +02005 import from GSMTAP_Types all;
6 import from GSMTAP_PortType all;
7 import from IPL4_GSMTAP_CtrlFunct all;
Harald Welte9a907b32017-07-15 10:34:27 +02008 import from TELNETasp_PortType all;
Harald Welte8542cef2017-07-19 20:06:26 +02009 import from Osmocom_VTY_Functions all;
Harald Welte56db5fd2017-07-14 18:25:59 +020010
11 const octetstring si1 := '5506198fb38000000000000000000000000000e504002b'O;
12 const octetstring si2 := '59061a00000000000000000000000000000000ffe50400'O;
13 const octetstring si3 := '49061b000062f22404d2490301275d40e50400392b2b2b'O;
14 const octetstring si4 := '31061c62f22404d25d40e504002b2b2b2b2b2b2b2b2b2b'O;
Harald Weltebdc5dbd2017-07-16 00:00:43 +020015 const octetstring c_si2bis := '550602bfe809b3ff00000000000000000000007900002b'O;
16 const octetstring c_si2ter := '010603bf66b0aa0a00000002000000000000002b2b2b2b'O;
17 const octetstring c_si2quater := '050607a8a0364aa698d72ff424feee0506d5e7fff02043'O;
Harald Welte56db5fd2017-07-14 18:25:59 +020018
19 type component dummy_CT {
Harald Welteb622a3d2017-07-14 22:26:33 +020020 port GSMTAP_PT GSMTAP;
Harald Welte9a907b32017-07-15 10:34:27 +020021 port TELNETasp_PT BSCVTY;
Harald Weltebdc5dbd2017-07-16 00:00:43 +020022 var boolean initialized := false;
23 var SystemInformationConfig si_cfg := {
24 bcch_extended := false,
25 si1_present := true,
26 si2bis_present := false,
27 si2ter_present := false,
28 si2quater_present := false,
29 si7_present := false,
30 si8_present := false,
31 si9_present := false,
32 si13_present := false,
33 si13alt_present := false,
34 si15_present := false,
35 si16_present := false,
36 si17_present := false,
37 si2n_present := false,
38 si21_present := false,
39 si22_present := false
40 };
Harald Welte56db5fd2017-07-14 18:25:59 +020041 };
42
43 testcase TC_si1() runs on dummy_CT {
Harald Welte56db5fd2017-07-14 18:25:59 +020044 log("SI: ", dec_SystemInformation(si1));
45 log("SI: ", dec_SystemInformation(si2));
46 log("SI: ", dec_SystemInformation(si3));
47 log("SI: ", dec_SystemInformation(si4));
Harald Weltebdc5dbd2017-07-16 00:00:43 +020048 setverdict(pass);
Harald Welte56db5fd2017-07-14 18:25:59 +020049 }
50
Harald Welteb622a3d2017-07-14 22:26:33 +020051 template GsmtapHeader t_GsmtapHeader := {
52 version := GSMTAP_VERSION,
53 hdr_len := 4,
54 msg_type := ?,
55 timeslot := ?,
56 arfcn := ?,
57 signal_dbm := ?,
58 snr_db := ?,
59 frame_number := ?,
60 sub_type := ?,
61 antenna_nr := ?,
62 sub_slot := ?,
63 res := ?
64 }
65
66 template GsmtapHeader t_GsmtapHeaderUm(template GsmtapChannel ch) modifies t_GsmtapHeader := {
67 msg_type := GSMTAP_TYPE_UM,
68 sub_type := ch
69 }
70
Harald Welteb622a3d2017-07-14 22:26:33 +020071 template GsmtapMessage t_bcch := {
72 header := t_GsmtapHeaderUm(GSMTAP_CHANNEL_BCCH),
73 payload := ?
74 }
75
76 template GSMTAP_RecvFrom t_recvfrom(template GsmtapChannel ch) := {
77 connId := ?,
78 remName := ?,
79 remPort := ?,
80 locName := ?,
81 locPort := GSMTAP_PORT,
82 proto := {udp:={}},
83 userData := ?,
84 msg := { header := t_GsmtapHeaderUm(ch), payload := ?}
85 }
86
Harald Welteaf549412017-07-15 21:33:21 +020087 /* tuple of gsmtap header + decoded SI */
88 type record SystemInformationGsmtap {
89 GsmtapHeader gsmtap,
90 SystemInformation si
91 }
92
93 /* an arbitrary-length vector of decoded SI + gsmtap header */
94 type record of SystemInformationGsmtap SystemInformationVector;
95
96 /* an array of SI-vectors indexed by TC value */
97 type SystemInformationVector SystemInformationVectorPerTc[8];
98
99 type record of integer IntegerRecord;
100
Harald Weltef0a49972017-07-16 03:55:20 +0200101 function int2bool(integer int) return boolean {
102 if (int != 0) {
103 return true;
104 } else {
105 return false;
106 }
107 }
108
Harald Welteaf549412017-07-15 21:33:21 +0200109 function f_array_contains(IntegerRecord arr, integer key) return boolean {
110 for (var integer i:= 0; i< sizeof(arr); i := i + 1) {
111 if (arr[i] == key) {
112 return true;
113 }
114 }
115 return false;
116 }
117
118
119 /* compute TC as per 45.002 6.3.1.3 */
120 function f_gsm_compute_tc(integer fn) return integer {
121 return (fn / 51) mod 8;
122 }
123
124 /* determine if a given SI vector contains given SI type at least once */
125 function f_si_vecslot_contains(SystemInformationVector arr, RrMessageType key, boolean bcch_ext := false) return boolean {
126 for (var integer i:= 0; i< sizeof(arr); i := i + 1) {
127 var integer fn_mod51 := arr[i].gsmtap.frame_number mod 51;
128 if (not bcch_ext and fn_mod51 == 2 or
129 bcch_ext and fn_mod51 == 6) {
130 if (arr[i].si.header.message_type == key) {
131 return true;
132 }
133 }
134 }
135 return false;
136 }
137
Harald Welte39276772017-07-16 01:07:42 +0200138 /* ensure a given TC slot of the SI vector contains given SI type at least once at TC */
139 function f_ensure_si_vec_contains(SystemInformationVectorPerTc arr, integer tc, RrMessageType key, boolean ext_bcch := false) {
140 if (not f_si_vecslot_contains(arr[tc], key, ext_bcch)) {
141 log("Fail: No ", key, " in TC=", tc, "!");
142 setverdict(fail);
143 }
144 }
145
Harald Welteaf549412017-07-15 21:33:21 +0200146 /* check if a given SI vector contains given SI type at least once on any TC */
147 function f_si_vec_contains(SystemInformationVectorPerTc arr, RrMessageType key) return boolean {
148 for (var integer tc:= 0; tc < sizeof(arr); tc := tc + 1) {
149 if (f_si_vecslot_contains(arr[tc], key) or
150 f_si_vecslot_contains(arr[tc], key, true)) {
151 return true;
152 }
153 }
154 return false;
155 }
156
Harald Welte39276772017-07-16 01:07:42 +0200157 /* determine if a given SI vector contains given SI type at least N of M times */
158 function f_si_vecslot_contains_n_of_m(SystemInformationVector arr, RrMessageType key, boolean bcch_ext := false, integer n := 1, integer m := 4) return boolean {
159 var integer count := 0;
160 if (sizeof(arr) < m) {
Harald Welte75f761f2017-07-16 03:05:31 +0200161 testcase.stop("Error: Insufficient SI in array");
Harald Welte39276772017-07-16 01:07:42 +0200162 }
163 for (var integer i:= 0; i < m; i := i + 1) {
164 var integer fn_mod51 := arr[i].gsmtap.frame_number mod 51;
165 if (not bcch_ext and fn_mod51 == 2 or
166 bcch_ext and fn_mod51 == 6) {
167 if (arr[i].si.header.message_type == key) {
168 count := count + 1;
169 }
170 }
171 }
172 if (count >= n) {
173 return true;
174 } else {
175 return false;
176 }
177 }
178
179 /* ensure a given TC slot of the SI vector contains given SI type at least N out of M times at TC */
180 function f_ensure_si_vec_contains_n_of_m(SystemInformationVectorPerTc arr, integer tc, RrMessageType key, boolean ext_bcch := false, integer n, integer m) {
181 if (not f_si_vecslot_contains_n_of_m(arr[tc], key, ext_bcch, n, m)) {
182 log("Fail: Not ", n, "/", m, " of ", key, " in TC=", tc, "!");
183 setverdict(fail);
184 }
185 }
186
187 /* determine if a given SI vector contains given SI type at least once */
188 function f_si_vecslot_contains_only(SystemInformationVector arr, RrMessageType key, boolean bcch_ext := false) return boolean {
189 for (var integer i:= 0; i< sizeof(arr); i := i + 1) {
190 var integer fn_mod51 := arr[i].gsmtap.frame_number mod 51;
191 if (not bcch_ext and fn_mod51 == 2 or
192 bcch_ext and fn_mod51 == 6) {
193 if (arr[i].si.header.message_type != key) {
194 return false;
195 }
196 }
197 }
198 return true;
199 }
200
201 /* ensure a given TC slot of the SI vector contains only given SI type */
202 function f_ensure_si_vec_contains_only(SystemInformationVectorPerTc arr, integer tc, RrMessageType key, boolean ext_bcch := false) {
203 if (not f_si_vecslot_contains_only(arr[tc], key, ext_bcch)) {
204 log("Fail: Not all ", key, " in TC=", tc, "!");
Harald Welteaf549412017-07-15 21:33:21 +0200205 setverdict(fail);
206 }
207 }
208
209 /* SI configuration of cell, against which we validate actual SI messages */
210 type set SystemInformationConfig {
211 boolean bcch_extended,
212 boolean si1_present,
213 boolean si2bis_present,
214 boolean si2ter_present,
215 boolean si2quater_present,
216 boolean si7_present,
217 boolean si8_present,
218 boolean si9_present,
219 boolean si13_present,
220 boolean si13alt_present,
221 boolean si15_present,
222 boolean si16_present,
223 boolean si17_present,
224 boolean si2n_present,
225 boolean si21_present,
226 boolean si22_present
227 }
228
229 /* validate the SI scheduling according to TS 45.002 version 14.1.0 Release 14, Section 6.3.1.3 */
230 function f_validate_si_scheduling(SystemInformationConfig cfg, SystemInformationVectorPerTc si_per_tc) {
231 var integer i;
232 for (i := 0; i < sizeof(si_per_tc); i := i + 1) {
233 if (sizeof(si_per_tc[i]) == 0) {
234 setverdict(fail, "No SI messages for TC=0!");
235 }
236 }
237 if (cfg.si1_present) {
238 /* ii) System Information Type 1 needs to be sent if frequency hopping is in use or
239 * when the NCH is present in a cell. If the MS finds another message on BCCH Norm
240 * when TC = 0, it can assume that System Information Type 1 is not in use. */
241 f_ensure_si_vec_contains(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_1);
Harald Welte39276772017-07-16 01:07:42 +0200242 /* make sure *ALL* contain SI1 */
243 f_ensure_si_vec_contains_only(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_1);
Harald Welteaf549412017-07-15 21:33:21 +0200244 }
245 f_ensure_si_vec_contains(si_per_tc, 1, SYSTEM_INFORMATION_TYPE_2);
246 /* iii) A SI 2 message will be sent at least every time TC = 1 */
247 f_ensure_si_vec_contains(si_per_tc, 2, SYSTEM_INFORMATION_TYPE_3);
248 f_ensure_si_vec_contains(si_per_tc, 6, SYSTEM_INFORMATION_TYPE_3);
249 f_ensure_si_vec_contains(si_per_tc, 3, SYSTEM_INFORMATION_TYPE_4);
250 f_ensure_si_vec_contains(si_per_tc, 7, SYSTEM_INFORMATION_TYPE_4);
251
252 /* iii) System information type 2 bis or 2 ter messages are sent if needed, as determined by the
253 * system operator. If only one of them is needed, it is sent when TC = 5. If both are
254 * needed, 2bis is sent when TC = 5 and 2ter is sent at least once within any of 4
255 * consecutive occurrences of TC = 4. */
256 if (cfg.si2bis_present and not cfg.si2ter_present) {
257 f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2bis);
258 } else if (cfg.si2ter_present and not cfg.si2bis_present) {
259 f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2ter);
260 } else if (cfg.si2ter_present and cfg.si2bis_present) {
261 f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2bis);
Harald Welte39276772017-07-16 01:07:42 +0200262 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2ter, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200263 }
264
265 if (cfg.si7_present or cfg.si8_present) {
266 /* vi) Use of System Information type 7 and 8 is not always necessary. It is necessary
267 * if System Information type 4 does not contain all information needed for cell
268 * selection and reselection. */
269 if (not cfg.bcch_extended) {
Harald Welte75f761f2017-07-16 03:05:31 +0200270 testcase.stop("Error: SI7/SI8 require BCCH Extd.");
Harald Welteaf549412017-07-15 21:33:21 +0200271 }
272 if (cfg.si7_present) {
273 f_ensure_si_vec_contains(si_per_tc, 7, SYSTEM_INFORMATION_TYPE_7, true);
274 }
275 if (cfg.si8_present) {
276 f_ensure_si_vec_contains(si_per_tc, 3, SYSTEM_INFORMATION_TYPE_8, true);
277 }
278 }
279
280 if (cfg.si2quater_present) {
281 /* iii) System information type 2 quater is sent if needed, as determined by the system
282 * operator. If sent on BCCH Norm, it shall be sent when TC = 5 if neither of 2bis
283 * and 2ter are used, otherwise it shall be sent at least once within any of 4
284 * consecutive occurrences of TC = 4. If sent on BCCH Ext, it is sent at least once
285 * within any of 4 consecutive occurrences of TC = 5. */
286 if (not (cfg.bcch_extended)) {
287 if (not (cfg.si2bis_present or cfg.si2ter_present)) {
288 f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2quater);
289 } else {
Harald Welte39276772017-07-16 01:07:42 +0200290 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2quater, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200291 }
292 } else {
Harald Welte39276772017-07-16 01:07:42 +0200293 f_ensure_si_vec_contains_n_of_m(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2quater, true, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200294 }
295 }
296 if (cfg.si9_present) {
297 /* vi) System Information type 9 is sent in those blocks with TC = 4 which are specified
298 * in system information type 3 as defined in 3GPP TS 44.018. */
299 f_ensure_si_vec_contains(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_9); // FIXME SI3
300 }
301 if (cfg.si13_present) {
302 /* vii) System Information type 13 is only related to the GPRS service. System Information
303 * Type 13 need only be sent if GPRS support is indicated in one or more of System
304 * Information Type 3 or 4 or 7 or 8 messages. These messages also indicate if the
305 * message is sent on the BCCH Norm or if the message is transmitted on the BCCH Ext.
306 * In the case that the message is sent on the BCCH Norm, it is sent at least once
307 * within any of 4 consecutive occurrences of TC=4. */
308 if (not cfg.bcch_extended) {
Harald Welte39276772017-07-16 01:07:42 +0200309 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_13, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200310 } else {
311 f_ensure_si_vec_contains(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_13, true);
312 }
313 if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_13alt)) {
314 setverdict(fail, "Cannot have SI13alt and SI13");
315 }
316 }
317 if (cfg.si16_present or cfg.si17_present) {
318 /* viii) System Information type 16 and 17 are only related to the SoLSA service. They
319 * should not be sent in a cell where network sharing is used (see rule xv). */
320 if (cfg.si22_present) {
Harald Welte75f761f2017-07-16 03:05:31 +0200321 testcase.stop("Error: Cannot have SI16/SI17 and SI22!");
Harald Welteaf549412017-07-15 21:33:21 +0200322 }
323 if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_22)) {
324 setverdict(fail, "Cannot have SI16/SI17 and SI22!");
325 }
326 if (not cfg.bcch_extended) {
Harald Welte75f761f2017-07-16 03:05:31 +0200327 testcase.stop("Error: SI16/SI17 requires BCCH Extd!");
Harald Welteaf549412017-07-15 21:33:21 +0200328 }
329 if (cfg.si16_present) {
330 f_ensure_si_vec_contains(si_per_tc, 6, SYSTEM_INFORMATION_TYPE_16, true);
331 }
332 if (cfg.si17_present) {
333 f_ensure_si_vec_contains(si_per_tc, 2, SYSTEM_INFORMATION_TYPE_17, true);
334 }
335 }
336
337 /* ix) System Information type 18 and 20 are sent in order to transmit non-GSM
338 * broadcast information. The frequency with which they are sent is determined by the
339 * system operator. System Information type 9 identifies the scheduling of System
340 * Information type 18 and 20 messages. */
341
342 /* x) System Information Type 19 is sent if COMPACT neighbours exist. If System
343 * Information Type 19 is present, then its scheduling shall be indicated in System
344 * Information Type 9. */
345
346 if (cfg.si15_present) {
347 /* xi) System Information Type 15 is broadcast if dynamic ARFCN mapping is used in the
348 * PLMN. If sent on BCCH Norm, it is sent at least once within any of 4 consecutive
349 * occurrences of TC = 4. If sent on BCCH Ext, it is sent at least once within any of
350 * 4 consecutive occurrences of TC = 1. */
351 if (not cfg.bcch_extended) {
Harald Welte39276772017-07-16 01:07:42 +0200352 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_15, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200353 } else {
Harald Welte39276772017-07-16 01:07:42 +0200354 f_ensure_si_vec_contains_n_of_m(si_per_tc, 1, SYSTEM_INFORMATION_TYPE_15, true, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200355 }
356 }
357 if (cfg.si13alt_present) {
358 /* xii) System Information type 13 alt is only related to the GERAN Iu mode. System
359 * Information Type 13 alt need only be sent if GERAN Iu mode support is indicated in
360 * one or more of System Information Type 3 or 4 or 7 or 8 messages and SI 13 is not
361 * broadcast. These messages also indicate if the message is sent on the BCCH Norm or
362 * if the message is transmitted on the BCCH Ext. In the case that the message is sent
363 * on the BCCH Norm, it is sent at least once within any of 4 consecutive occurrences
364 * of TC = 4. */
365 if (cfg.si13_present) {
Harald Welte75f761f2017-07-16 03:05:31 +0200366 testcase.stop("Error: Cannot have SI13alt and SI13");
Harald Welteaf549412017-07-15 21:33:21 +0200367 }
368 if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_13)) {
369 setverdict(fail, "Cannot have SI13alt and SI13");
370 }
371 if (not cfg.bcch_extended) {
Harald Welte39276772017-07-16 01:07:42 +0200372 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_13alt, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200373 } else {
374 f_ensure_si_vec_contains(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_13alt, true);
375 }
376 }
377 if (cfg.si2n_present) {
378 /* xiii) System Information Type 2n is optionally sent on BCCH Norm or BCCH Ext if needed,
379 * as determined by the system operator. In the case that the message is sent on the
380 * BCCH Norm, it is sent at least once within any of 4 consecutive occurrences of TC =
381 * 4. If the message is sent on BCCH Ext, it is sent at least once within any of 2
382 * consecutive occurrences of TC = 4. */
383 if (not cfg.bcch_extended) {
Harald Welte39276772017-07-16 01:07:42 +0200384 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2n, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200385 } else {
Harald Welte39276772017-07-16 01:07:42 +0200386 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2n, true, 2, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200387 }
388 }
389 if (cfg.si21_present) {
390 /* xiv) System Information Type 21 is optionally sent on BCCH Norm or BCCH Ext, as
391 * determined by the system operator. If Extended Access Barring is in use in the cell
392 * then this message is sent at least once within any of 4 consecutive occurrences of
393 * TC = 4 regardless if it is sent on BCCH Norm or BCCH Ext. If BCCH Ext is used in a
394 * cell then this message shall only be sent on BCCH Ext. */
395 if (not cfg.bcch_extended) {
Harald Welte39276772017-07-16 01:07:42 +0200396 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_21, false, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200397 } else {
Harald Welte39276772017-07-16 01:07:42 +0200398 f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_21, true, 1, 4);
Harald Welteaf549412017-07-15 21:33:21 +0200399 if (f_si_vecslot_contains(si_per_tc[4], SYSTEM_INFORMATION_TYPE_21)) {
400 setverdict(fail, "Cannot have SI21 on BCCH Norm if BCCH Extd enabled!");
401 }
402 }
403 }
404 if (cfg.si22_present) {
405 /* xv) System Information Type 22 is sent if network sharing is in use in the cell. It
406 * should not be sent in a cell where SoLSA is used (see rule viii). System
407 * Information Type 22 instances shall be sent on BCCH Ext within any occurrence of TC
408 * =2 and TC=6. */
409 if (cfg.si16_present or cfg.si17_present) {
Harald Welte75f761f2017-07-16 03:05:31 +0200410 testcase.stop("Error: Cannot have SI16/SI17 and SI22!");
Harald Welteaf549412017-07-15 21:33:21 +0200411 }
412 if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_16) or
413 f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_17)) {
414 setverdict(fail, "Cannot have SI16/SI17 and SI22!");
415 }
416 if (not cfg.bcch_extended) {
Harald Welte75f761f2017-07-16 03:05:31 +0200417 testcase.stop("Error: SI22 requires BCCH Extd!");
Harald Welte39276772017-07-16 01:07:42 +0200418 } else {
419 f_ensure_si_vec_contains_only(si_per_tc, 2, SYSTEM_INFORMATION_TYPE_22, true);
420 f_ensure_si_vec_contains_only(si_per_tc, 6, SYSTEM_INFORMATION_TYPE_22, true);
Harald Welteaf549412017-07-15 21:33:21 +0200421 }
422 }
423 }
424
425
Harald Welte39276772017-07-16 01:07:42 +0200426 function f_gsmtap_sample_si(GSMTAP_PT pt, float duration := 8.0) return SystemInformationVectorPerTc {
Harald Welteaf549412017-07-15 21:33:21 +0200427 timer T := duration;
428 var SystemInformationVectorPerTc si_per_tc;
429 var GSMTAP_RecvFrom rf;
430
431 /* initialize all per-TC vectors empty */
432 for (var integer i := 0; i < sizeof(si_per_tc); i := i + 1) {
433 si_per_tc[i] := {};
434 }
435
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200436 /* flush all previous/buffered elements */
437 pt.clear
438
Harald Welteaf549412017-07-15 21:33:21 +0200439 T.start;
440 alt {
441 [] pt.receive(t_recvfrom(GSMTAP_CHANNEL_BCCH)) -> value rf {
442 var SystemInformation si := dec_SystemInformation(rf.msg.payload);
443 var SystemInformationGsmtap sig := { rf.msg.header, si };
444 var integer tc := f_gsm_compute_tc(rf.msg.header.frame_number);
445 log("SI received at TC=", tc, ": ", si);
446 /* append to the per-TC bucket */
447 si_per_tc[tc] := si_per_tc[tc] & { sig };
448 repeat;
449 }
450 [] pt.receive { repeat; };
451 [] T.timeout { };
452 }
Harald Welte39276772017-07-16 01:07:42 +0200453 for (var integer i := 0; i < sizeof(si_per_tc); i := i + 1) {
454 log(testcasename(), ": TC=", i, " has #of SI=", sizeof(si_per_tc[i]));
455 }
Harald Welteaf549412017-07-15 21:33:21 +0200456 return si_per_tc;
457 }
458
Harald Weltef0a49972017-07-16 03:55:20 +0200459 function f_gsmtap_get_si(GSMTAP_PT pt, RrMessageType msg_type) return SystemInformation {
460 timer T := 10.0;
461 var GSMTAP_RecvFrom rf;
462 var SystemInformation si;
463
464 /* flush all previous/buffered elements */
465 pt.clear
466
467 T.start;
468 alt {
469 [] pt.receive(t_recvfrom(GSMTAP_CHANNEL_BCCH)) -> value rf {
470 si := dec_SystemInformation(rf.msg.payload);
471 if (si.header.message_type == msg_type) {
472 return si;
473 }
474 repeat;
475 }
476 [] pt.receive { repeat; };
477 [] T.timeout { testcase.stop("Error waiting for SI on GSMTAP"); };
478 }
479 return si;
480 }
481
482 function f_gsmtap_match_si(GSMTAP_PT pt, RrMessageType msg_type, template SystemInformation t) {
483 var SystemInformation si := f_gsmtap_get_si(pt, msg_type);
484 if (not match(si, t)) {
485 setverdict(fail, "SI ", si, " doesn't match ", t);
486 } else {
487 setverdict(pass);
488 }
489 }
490
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200491 function f_init() runs on dummy_CT {
492 if (initialized) {
493 return;
494 }
495 /* GSMTAP initialization */
Harald Welteb622a3d2017-07-14 22:26:33 +0200496 map(self:GSMTAP, system:GSMTAP);
497 IPL4_GSMTAP_CtrlFunct.f_IPL4_listen(GSMTAP, "0.0.0.0", GSMTAP_PORT, {udp := {}});
498
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200499 /* VTY initialization */
500 map(self:BSCVTY, system:BSCVTY);
501 f_vty_set_prompts(BSCVTY)
Harald Weltefd512cb2017-07-16 01:34:15 +0200502 f_vty_transceive(BSCVTY, "enable");
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200503
504 initialized := true;
505 }
506
507 testcase TC_si_default() runs on dummy_CT {
508 var SystemInformationVectorPerTc si_per_tc;
509
510 f_init();
511
Harald Welteaf549412017-07-15 21:33:21 +0200512 si_per_tc := f_gsmtap_sample_si(GSMTAP);
Harald Welteaf549412017-07-15 21:33:21 +0200513 f_validate_si_scheduling(si_cfg, si_per_tc);
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200514
Harald Welteaf549412017-07-15 21:33:21 +0200515 setverdict(pass);
Harald Welteb622a3d2017-07-14 22:26:33 +0200516 }
517
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200518 testcase TC_si_sched_2bis() runs on dummy_CT {
519 var SystemInformationVectorPerTc si_per_tc;
520 f_init();
521
522 /* Enable SI2bis + validate scheduling */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200523 si_cfg.si2bis_present := true;
Harald Weltefe1052d2017-07-16 01:24:01 +0200524 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200525 si_per_tc := f_gsmtap_sample_si(GSMTAP);
526 f_validate_si_scheduling(si_cfg, si_per_tc);
527
528 /* cleanup */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200529 si_cfg.si2bis_present := false;
Harald Weltefe1052d2017-07-16 01:24:01 +0200530 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200531
532 setverdict(pass);
533 }
534
535 testcase TC_si_sched_2ter() runs on dummy_CT {
536 var SystemInformationVectorPerTc si_per_tc;
537 f_init();
538
539 /* Enable SI2ter + validate scheduling */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200540 si_cfg.si2ter_present := true;
Harald Weltefe1052d2017-07-16 01:24:01 +0200541 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200542 si_per_tc := f_gsmtap_sample_si(GSMTAP);
543 f_validate_si_scheduling(si_cfg, si_per_tc);
544
545 /* cleanup */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200546 si_cfg.si2ter_present := false;
Harald Weltefe1052d2017-07-16 01:24:01 +0200547 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200548
549 setverdict(pass);
550 }
551
552 testcase TC_si_sched_2ter_2bis() runs on dummy_CT {
553 var SystemInformationVectorPerTc si_per_tc;
554 f_init();
555
556 /* Enable SI2bis + SI2ter + validate scheduling */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200557 si_cfg.si2bis_present := true;
558 si_cfg.si2ter_present := true;
Harald Weltefe1052d2017-07-16 01:24:01 +0200559 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200560 si_per_tc := f_gsmtap_sample_si(GSMTAP);
561 f_validate_si_scheduling(si_cfg, si_per_tc);
562
563 /* cleanup */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200564 si_cfg.si2bis_present := false;
565 si_cfg.si2ter_present := false;
Harald Weltefe1052d2017-07-16 01:24:01 +0200566 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200567
568 setverdict(pass);
569 }
570
571 testcase TC_si_sched_2quater() runs on dummy_CT {
572 var SystemInformationVectorPerTc si_per_tc;
573 f_init();
574
575 /* Enable SI2quater + validate scheduling */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200576 si_cfg.si2quater_present := true;
Harald Weltefe1052d2017-07-16 01:24:01 +0200577 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200578
579 /* cleanup */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200580 si_cfg.si2quater_present := false;
Harald Weltefe1052d2017-07-16 01:24:01 +0200581 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200582
583 setverdict(pass);
584 }
585
586 testcase TC_si_sched_13() runs on dummy_CT {
587 var SystemInformationVectorPerTc si_per_tc;
588 f_init();
589
590 /* Enable SI2ter + validate scheduling */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200591 si_cfg.si13_present := true;
Harald Weltefe1052d2017-07-16 01:24:01 +0200592 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200593 si_per_tc := f_gsmtap_sample_si(GSMTAP);
594 f_validate_si_scheduling(si_cfg, si_per_tc);
595
596 /* cleanup */
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200597 si_cfg.si13_present := false;
Harald Weltefe1052d2017-07-16 01:24:01 +0200598 f_si_cfg_to_vty();
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200599
600 setverdict(pass);
601 }
Harald Welte9a907b32017-07-15 10:34:27 +0200602
Harald Weltefe1052d2017-07-16 01:24:01 +0200603 testcase TC_si_sched_13_2bis_2ter_2quater() runs on dummy_CT {
604 var SystemInformationVectorPerTc si_per_tc;
605 f_init();
606
607 si_cfg.si2bis_present := true;
608 si_cfg.si2ter_present := true;
609 si_cfg.si2quater_present := true;
610 si_cfg.si13_present := true;
611 f_si_cfg_to_vty();
612 si_per_tc := f_gsmtap_sample_si(GSMTAP);
613 f_validate_si_scheduling(si_cfg, si_per_tc);
614
615 /* cleanup */
616 si_cfg.si2bis_present := false;
617 si_cfg.si2ter_present := false;
618 si_cfg.si2quater_present := false;
619 si_cfg.si13_present := false;
620 f_si_cfg_to_vty();
621
622 setverdict(pass);
623 }
624
625 function f_si_cfg_to_vty() runs on dummy_CT {
626 if (si_cfg.si2bis_present) {
627 f_vty_si_static(BSCVTY, 0, "2bis", c_si2bis);
628 } else {
629 f_vty_si_computed(BSCVTY, 0, "2bis");
630 }
631 if (si_cfg.si2ter_present) {
632 f_vty_si_static(BSCVTY, 0, "2ter", c_si2ter);
633 } else {
634 f_vty_si_computed(BSCVTY, 0, "2ter");
635 }
636 if (si_cfg.si13_present) {
637 f_vty_gprs_mode(BSCVTY, 0, "gprs");
638 } else {
639 f_vty_gprs_mode(BSCVTY, 0, "none");
640 }
641 if (si_cfg.si2quater_present) {
642 f_vty_si2q_add_uarfcn(BSCVTY, 0, 23, 42);
643 } else {
644 f_vty_si2q_del_uarfcn(BSCVTY, 0, 23, 42);
645 }
646 /* for debugging */
647 f_vty_transceive(BSCVTY, "write terminal");
648 /* actually commit the changes from BSC -> BTS */
649 f_vty_si_resend(BSCVTY, 0);
650 }
Harald Welte9a907b32017-07-15 10:34:27 +0200651
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200652 function f_vty_si_static(TELNETasp_PT pt, BtsNr bts, charstring si, octetstring bytes) {
653 f_vty_enter_cfg_bts(pt, bts);
654 f_vty_transceive(pt, "system-information " & si & " mode static");
655 f_vty_transceive(pt, "system-information " & si & " static " & hex2str(oct2hex(bytes)));
656 f_vty_transceive(pt, "end");
657 }
658
659 function f_vty_si_computed(TELNETasp_PT pt, BtsNr bts, charstring si) {
660 f_vty_enter_cfg_bts(pt, bts);
661 f_vty_transceive(pt, "system-information " & si & " mode computed");
662 f_vty_transceive(pt, "end");
663 }
664
665 function f_vty_si_resend(TELNETasp_PT pt, BtsNr bts := 0) {
666 f_vty_transceive(pt, "bts " & int2str(bts) & " resend-system-information");
Harald Weltec17c88e2017-07-16 00:39:59 +0200667 /* wait for 1s until changes propagate */
668 timer T := 1.0;
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200669 T.start;
670 T.timeout;
671 }
672
673 function f_vty_gprs_mode(TELNETasp_PT pt, integer bts, BtsGprsMode mode) {
674 f_vty_enter_cfg_bts(pt, bts);
675 f_vty_transceive(pt, "gprs mode " & mode);
676 f_vty_transceive(pt, "end");
677 }
678
679 function f_vty_si2q_add_uarfcn(TELNETasp_PT pt, BtsNr bts, UmtsArfcn uarfcn, UmtsScramblingCode sc, integer diversity := 0) {
680 f_vty_enter_cfg_bts(pt, bts);
681 f_vty_transceive(pt, "si2quater neighbor-list add uarfcn " & int2str(uarfcn) & " " & int2str(sc) & " " & int2str(diversity));
682 f_vty_transceive(pt, "end");
683 }
684
685 function f_vty_si2q_del_uarfcn(TELNETasp_PT pt, BtsNr bts, UmtsArfcn uarfcn, UmtsScramblingCode sc) {
686 f_vty_enter_cfg_bts(pt, bts);
687 f_vty_transceive(pt, "si2quater neighbor-list del uarfcn " & int2str(uarfcn) & " " & int2str(sc));
688 f_vty_transceive(pt, "end");
689 }
690
691 testcase TC_telnet() runs on dummy_CT {
692 f_init();
Harald Weltefd512cb2017-07-16 01:34:15 +0200693 f_vty_enter_config(BSCVTY);
Harald Welte9a907b32017-07-15 10:34:27 +0200694 f_vty_transceive(BSCVTY, "show network")
Harald Welte9a907b32017-07-15 10:34:27 +0200695 f_vty_transceive(BSCVTY, "network")
696 f_vty_transceive(BSCVTY, "bts 0")
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200697 f_vty_transceive(BSCVTY, "end")
698 setverdict(pass);
Harald Welte9a907b32017-07-15 10:34:27 +0200699 }
700
Harald Weltef0a49972017-07-16 03:55:20 +0200701 template SystemInformation t_SI_SI3 := {
Harald Welted2e342f2017-07-16 07:34:13 +0200702 header := t_RrHeader(SYSTEM_INFORMATION_TYPE_3, ?),
Harald Weltef0a49972017-07-16 03:55:20 +0200703 payload := { si3 := t_SI3 }
704 }
705
706 testcase TC_cellid() runs on dummy_CT {
707 var CellIdentity cid := float2int(rnd() * 65535.0);
708 var template SystemInformation t := t_SI_SI3;
709 t.payload.si3.cell_id := cid;
710
711 f_init();
712 f_vty_enter_cfg_bts(BSCVTY, 0);
713 f_vty_transceive(BSCVTY, "cell_identity " & int2str(cid));
714 f_vty_transceive(BSCVTY, "end")
715 f_vty_si_resend(BSCVTY, 0);
716
717 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
718 }
719
720 testcase TC_lac() runs on dummy_CT {
721 var uint16_t lac := float2int(rnd() * 65535.0);
722
723 var template SystemInformation t := t_SI_SI3;
724 t.payload.si3.lai.lac := lac;
725
726 f_init();
727 f_vty_enter_cfg_bts(BSCVTY, 0);
728 f_vty_transceive(BSCVTY, "location_area_code " & int2str(lac));
729 f_vty_transceive(BSCVTY, "end")
730 f_vty_si_resend(BSCVTY, 0);
731
732 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
733 }
734
735 testcase TC_rach_tx_int() runs on dummy_CT {
736 var uint16_t rach_tx_int := float2int(rnd() * 15.0);
737
738 var template SystemInformation t := t_SI_SI3;
739 t.payload.si3.rach_control.tx_integer := int2bit(rach_tx_int, 4);
740
741 f_init();
742 f_vty_enter_cfg_bts(BSCVTY, 0);
743 f_vty_transceive(BSCVTY, "rach tx integer " & int2str(rach_tx_int));
744 f_vty_transceive(BSCVTY, "end")
745 f_vty_si_resend(BSCVTY, 0);
746
747 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
748 }
749
750 testcase TC_rach_max_tx() runs on dummy_CT {
751 var uint16_t r := float2int(rnd() * 3.0);
752 const integer max_tx_map[4] := { 1, 2, 4, 7 };
753 var template SystemInformation t := t_SI_SI3;
754 t.payload.si3.rach_control.max_retrans := int2bit(r, 2);
755
756 f_init();
757 f_vty_enter_cfg_bts(BSCVTY, 0);
758 f_vty_transceive(BSCVTY, "rach max transmission " & int2str(max_tx_map[r]));
759 f_vty_transceive(BSCVTY, "end")
760 f_vty_si_resend(BSCVTY, 0);
761
762 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
763 }
764
765 testcase TC_dtx_ul() runs on dummy_CT {
766 var integer i := float2int(rnd() * 2.0);
767 var template SystemInformation t := t_SI_SI3;
768 t.payload.si3.cell_options.dtx := int2bit(i, 2);
769
770 f_init();
771 f_vty_enter_cfg_bts(BSCVTY, 0);
772 if (i == 0) {
773 f_vty_transceive(BSCVTY, "dtx uplink");
774 } else if (i == 1) {
775 f_vty_transceive(BSCVTY, "dtx uplink force");
776 } else {
777 f_vty_transceive(BSCVTY, "no dtx uplink");
778 }
779
780 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
781 }
782
783 testcase TC_attach() runs on dummy_CT {
784 var integer i := float2int(rnd());
785 var template SystemInformation t := t_SI_SI3;
786 t.payload.si3.ctrl_chan_desc.att := int2bool(i);
787
788 f_init();
789 f_vty_enter_cfg_bts(BSCVTY, 0);
790 f_vty_transceive(BSCVTY, "channel-descrption attach " & int2str(i));
791 f_vty_transceive(BSCVTY, "end")
792 f_vty_si_resend(BSCVTY, 0);
793
794 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
795 }
796
797 testcase TC_bs_pa_mfrms() runs on dummy_CT {
798 var integer i := 2 + float2int(rnd() * 7.0);
799 var template SystemInformation t := t_SI_SI3;
800 t.payload.si3.ctrl_chan_desc.bs_pa_mfrms := i - 2;
801
802 f_init();
803 f_vty_enter_cfg_bts(BSCVTY, 0);
804 f_vty_transceive(BSCVTY, "channel-descrption bs-pa-mfrms " & int2str(i));
805 f_vty_transceive(BSCVTY, "end")
806 f_vty_si_resend(BSCVTY, 0);
807
808 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
809 }
810
811 testcase TC_bs_ag_blks_res() runs on dummy_CT {
812 var integer i := float2int(rnd() * 7.0);
813 var template SystemInformation t := t_SI_SI3;
814 t.payload.si3.ctrl_chan_desc.bs_ag_blks_res := i;
815
816 f_init();
817 f_vty_enter_cfg_bts(BSCVTY, 0);
818 f_vty_transceive(BSCVTY, "channel-descrption bs-ag-blks-res " & int2str(i));
819 f_vty_transceive(BSCVTY, "end")
820 f_vty_si_resend(BSCVTY, 0);
821
822 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
823 }
824
825 testcase TC_radio_link_timeout() runs on dummy_CT {
826 var integer i := float2int(rnd() * 15.0);
827 var template SystemInformation t := t_SI_SI3;
828 t.payload.si3.cell_options.radio_link_timeout := int2bit(i, 4);
829
830 f_init();
831 f_vty_enter_cfg_bts(BSCVTY, 0);
832 f_vty_transceive(BSCVTY, "radio-link-timeout " & int2str(4 + i*4));
833 f_vty_transceive(BSCVTY, "end")
834 f_vty_si_resend(BSCVTY, 0);
835
836 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
837 }
838
839 testcase TC_cell_resel_hyst() runs on dummy_CT {
840 var integer i := float2int(rnd() * 7.0);
841 var template SystemInformation t := t_SI_SI3;
842 t.payload.si3.cell_sel_par.cell_resel_hyst := i;
843
844 f_init();
845 f_vty_enter_cfg_bts(BSCVTY, 0);
846 f_vty_transceive(BSCVTY, "cell reselection hysteresis " & int2str(i*2));
847 f_vty_transceive(BSCVTY, "end")
848 f_vty_si_resend(BSCVTY, 0);
849
850 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
851 }
852
853 testcase TC_rxlev_acc_min() runs on dummy_CT {
854 var integer i := float2int(rnd() * 63.0);
855 var template SystemInformation t := t_SI_SI3;
856 t.payload.si3.cell_sel_par.rxlev_access_min := i;
857
858 f_init();
859 f_vty_enter_cfg_bts(BSCVTY, 0);
860 f_vty_transceive(BSCVTY, "rxlev access min " & int2str(i));
861 f_vty_transceive(BSCVTY, "end")
862 f_vty_si_resend(BSCVTY, 0);
863
864 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
865 }
866
867 testcase TC_neci() runs on dummy_CT {
868 var integer i := float2int(rnd() * 1.0);
869 var template SystemInformation t := t_SI_SI3;
870 t.payload.si3.cell_sel_par.neci := int2bool(i);
871
872 f_init();
873 f_vty_enter_cfg_network(BSCVTY);
874 f_vty_transceive(BSCVTY, "neci " & int2str(i));
875 f_vty_transceive(BSCVTY, "end")
876 f_vty_si_resend(BSCVTY, 0);
877
878 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
879 }
880
881 testcase TC_emerg_allowed() runs on dummy_CT {
882 var integer i := float2int(rnd());
883 var template SystemInformation t := t_SI_SI3;
884 if (i == 1) {
885 t.payload.si3.rach_control.ac := '?????0??????????'B;
886 } else {
887 t.payload.si3.rach_control.ac := '?????1??????????'B;
888 }
889
890 f_init();
891 f_vty_enter_cfg_bts(BSCVTY, 0);
892 f_vty_transceive(BSCVTY, "rach emergency call allowed " & int2str(i));
893 f_vty_transceive(BSCVTY, "end")
894 f_vty_si_resend(BSCVTY, 0);
895
896 f_gsmtap_match_si(GSMTAP, SYSTEM_INFORMATION_TYPE_3, t);
897 }
898
899 /* TODO:
900 * * don't only validate SI3 but check all other SI with same IE?
901 * * parse + validate rest octets somehow
902 * * validate contents/encoding of neighbor channel lists
903 * * validate si2quater sub-mux scheduling
904 */
905
906
Harald Welte56db5fd2017-07-14 18:25:59 +0200907 control {
908 execute(TC_si1());
Harald Welte9a907b32017-07-15 10:34:27 +0200909 execute(TC_telnet());
Harald Weltebdc5dbd2017-07-16 00:00:43 +0200910 execute(TC_si_default());
911 execute(TC_si_sched_2bis());
912 execute(TC_si_sched_2ter());
913 execute(TC_si_sched_2ter_2bis());
914 execute(TC_si_sched_2quater());
915 execute(TC_si_sched_13());
Harald Weltefe1052d2017-07-16 01:24:01 +0200916 execute(TC_si_sched_13_2bis_2ter_2quater());
Harald Weltef0a49972017-07-16 03:55:20 +0200917 execute(TC_neci());
918 execute(TC_cell_resel_hyst());
919 execute(TC_rxlev_acc_min());
920 execute(TC_cellid());
921 execute(TC_lac());
922 execute(TC_rach_tx_int());
923 execute(TC_rach_max_tx());
924 execute(TC_attach());
925 execute(TC_dtx_ul());
926 execute(TC_emerg_allowed());
927 execute(TC_bs_pa_mfrms());
928 execute(TC_bs_ag_blks_res());
929 execute(TC_radio_link_timeout());
Harald Welte56db5fd2017-07-14 18:25:59 +0200930 }
931}