blob: 53c36c89f9115ddfe4df498d127381c694f057e9 [file] [log] [blame]
Harald Welte56db5fd2017-07-14 18:25:59 +02001/* Encoding/Decoding routines for GSM System Information messages
Harald Welte34b5a952019-05-27 11:54:11 +02002 * according to 3GPP TS 44.018 Version 12.3.0 Release 12
3 *
4 * (C) 2018 Harald Welte <laforge@gnumonks.org>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
Harald Welte56db5fd2017-07-14 18:25:59 +020012
13module GSM_SystemInformation {
14
15 import from General_Types all;
Harald Weltea082a692017-07-15 15:58:13 +020016 import from GSM_Types all;
Harald Weltef9764922017-08-20 22:47:44 +020017 import from GSM_RR_Types all;
Neels Hofmeyra5f0ed22020-07-06 02:39:40 +020018 import from GSM_RestOctets all;
Harald Welte615bd542017-07-14 18:28:55 +020019 import from Osmocom_Types all;
Harald Welte56db5fd2017-07-14 18:25:59 +020020
Harald Welte56db5fd2017-07-14 18:25:59 +020021 type union ArfcnOrMaio {
22 uint12_t arfcn,
23 MaioHsn maio_hsn
24 } with { variant "" };
25
Harald Welte56db5fd2017-07-14 18:25:59 +020026 /* 24.008 10.5.1.1 */
Harald Welte484160b2017-07-28 13:30:24 +020027 type uint16_t SysinfoCellIdentity;
Harald Welte56db5fd2017-07-14 18:25:59 +020028
Harald Welte56db5fd2017-07-14 18:25:59 +020029 /* 44.018 10.5.2.1b */
30 type octetstring CellChannelDescription with { variant "FIELDLENGTH(16)" };
31
32 /* 44.018 10.5.2.3 */
Harald Welte82ccef72018-02-25 16:17:33 +010033 type enumerated CellOptions_DTX {
34 MS_MAY_USE_UL_DTX ('00'B),
35 MS_SHALL_USE_UL_DTX ('01'B),
36 MS_SHALL_NOT_USE_UL_DTX ('10'B)
37 } with { variant "FIELDLENGTH(2)" };
Harald Welte56db5fd2017-07-14 18:25:59 +020038 type record CellOptions {
39 boolean dn_ind,
40 boolean pwrc,
Harald Welte82ccef72018-02-25 16:17:33 +010041 CellOptions_DTX dtx,
42 uint4_t radio_link_tout_div4
Harald Welte56db5fd2017-07-14 18:25:59 +020043 } with { variant "" };
44
45 /* 44.018 10.5.2.3a */
46 type record CellOptionsSacch {
47 BIT1 dtx_ext,
48 boolean pwrc,
49 BIT2 dtx,
50 BIT4 radio_link_timeout
51 } with { variant "" };
52
53 /* 44.018 10.5.2.4 */
54 type record CellSelectionParameters {
Harald Welte82ccef72018-02-25 16:17:33 +010055 uint3_t cell_resel_hyst_2dB,
Harald Welte56db5fd2017-07-14 18:25:59 +020056 uint5_t ms_txpwr_max_cch,
Harald Welte82ccef72018-02-25 16:17:33 +010057 BIT1 acs,
Harald Welte56db5fd2017-07-14 18:25:59 +020058 boolean neci,
59 uint6_t rxlev_access_min
60 } with { variant "" };
61
Harald Welte56db5fd2017-07-14 18:25:59 +020062 /* 44.018 10.5.2.11 */
Harald Welte82ccef72018-02-25 16:17:33 +010063 type enumerated CtrlChanDesc_CC {
64 CCHAN_DESC_1CCCH_NOT_COMBINED ('000'B),
65 CCHAN_DESC_1CCCH_COMBINED ('001'B),
66 CCHAN_DESC_2CCCH_NOT_COMBINED ('010'B),
67 CCHAN_DESC_3CCCH_NOT_COMBINED ('100'B),
68 CCHAN_DESC_4CCCH_NOT_COMBINED ('110'B)
69 } with { variant "FIELDLENGTH(3)" };
70 type enumerated CBQ3 {
71 CBQ3_IU_MODE_NOT_SUPPORTED ('00'B),
72 CBQ3_IU_MODE_MS_BARRED ('01'B),
73 CBQ3_IU_MODE_NOT_BARRED ('10'B)
74 } with { variant "FIELDLENGTH(2)" };
Harald Welte56db5fd2017-07-14 18:25:59 +020075 type record ControlChannelDescription {
Harald Welte82ccef72018-02-25 16:17:33 +010076 boolean msc_r99,
Harald Welte56db5fd2017-07-14 18:25:59 +020077 boolean att,
78 uint3_t bs_ag_blks_res,
Harald Welte82ccef72018-02-25 16:17:33 +010079 CtrlChanDesc_CC ccch_conf,
Harald Welte56db5fd2017-07-14 18:25:59 +020080 boolean si22ind,
Harald Welte82ccef72018-02-25 16:17:33 +010081 CBQ3 cbq3,
Harald Welte56db5fd2017-07-14 18:25:59 +020082 BIT2 spare,
Harald Welte82ccef72018-02-25 16:17:33 +010083 uint3_t bs_pa_mfrms, /* off by 2 */
Harald Welte56db5fd2017-07-14 18:25:59 +020084 uint8_t t3212
85 } with { variant "" };
86
Harald Welte162b1602017-07-16 03:05:02 +020087 template ControlChannelDescription t_ControlChannelDescription := { ?, ?, ?, ?, ?, ?, '00'B, ?, ? };
88
Harald Welte56db5fd2017-07-14 18:25:59 +020089 /* 44.018 10.5.2.22 */
90 type octetstring NeighbourCellDescription with { variant "FIELDLENGTH(16)" };
91
92 /* 44.018 10.5.2.22a */
93 type octetstring NeighbourCellDescription2 with { variant "FIELDLENGTH(16)" };
94
95 type bitstring AccessControlClass with { variant "FIELDLENGTH(16), BYTEORDER(last)" };
96
97 /* 44.018 10.5.2.29 */
Harald Welte82ccef72018-02-25 16:17:33 +010098 type enumerated RachCtrlPar_MR {
99 RACH_MAX_RETRANS_1 ('00'B),
100 RACH_MAX_RETRANS_2 ('01'B),
101 RACH_MAX_RETRANS_4 ('10'B),
102 RACH_MAX_RETRANS_7 ('11'B)
103 } with { variant "FIELDLENGTH(2)" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200104 type record RachControlParameters {
Harald Welte82ccef72018-02-25 16:17:33 +0100105 RachCtrlPar_MR max_retrans,
Harald Welte56db5fd2017-07-14 18:25:59 +0200106 BIT4 tx_integer,
107 boolean cell_barr_access,
Harald Welte82ccef72018-02-25 16:17:33 +0100108 boolean re_not_allowed,
109 AccessControlClass acc
110 } with { variant (acc) "FIELDLENGTH(16)" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200111
Harald Welte56db5fd2017-07-14 18:25:59 +0200112 /* 44.018 9.1.31 */
113 type record SystemInformationType1 {
Harald Welte56db5fd2017-07-14 18:25:59 +0200114 CellChannelDescription cell_chan_desc,
115 RachControlParameters rach_control,
Vadim Yanitskiyb7bc2e62020-05-04 21:22:41 +0700116 RestOctets rest_octets length(0..1)
117 } with { variant "" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200118
119 /* 44.018 9.1.32 */
120 type record SystemInformationType2 {
Harald Welte56db5fd2017-07-14 18:25:59 +0200121 NeighbourCellDescription bcch_freq_list,
122 BIT8 ncc_permitted,
123 RachControlParameters rach_control
124 } with { variant "" };
125
126 /* 44.018 9.1.33 */
127 type record SystemInformationType2bis {
Harald Welte56db5fd2017-07-14 18:25:59 +0200128 NeighbourCellDescription extd_bcch_freq_list,
129 RachControlParameters rach_control,
Vadim Yanitskiyb7bc2e62020-05-04 21:22:41 +0700130 RestOctets rest_octets length(0..1)
131 } with { variant "" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200132
133 /* 44.018 9.1.34 */
134 type record SystemInformationType2ter {
Harald Welte56db5fd2017-07-14 18:25:59 +0200135 NeighbourCellDescription2 extd_bcch_freq_list,
Vadim Yanitskiyb7bc2e62020-05-04 21:22:41 +0700136 RestOctets rest_octets length(0..4)
137 } with { variant "" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200138
Neels Hofmeyrbb277742020-07-06 02:39:58 +0200139 type record SystemInformationType2quater {
140 SI2quaterRestOctets rest_octets
141 } with { variant "" };
142
Harald Welte56db5fd2017-07-14 18:25:59 +0200143 /* 44.018 9.1.35 */
144 type record SystemInformationType3 {
Harald Welte484160b2017-07-28 13:30:24 +0200145 SysinfoCellIdentity cell_id,
Harald Welte56db5fd2017-07-14 18:25:59 +0200146 LocationAreaIdentification lai,
147 ControlChannelDescription ctrl_chan_desc,
148 CellOptions cell_options,
149 CellSelectionParameters cell_sel_par,
150 RachControlParameters rach_control,
Neels Hofmeyra5f0ed22020-07-06 02:39:40 +0200151 SI3RestOctets rest_octets
Vadim Yanitskiyb7bc2e62020-05-04 21:22:41 +0700152 } with { variant "" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200153
Harald Welte162b1602017-07-16 03:05:02 +0200154 template SystemInformationType3 t_SI3 := {
155 cell_id := ?,
156 lai := ?,
157 ctrl_chan_desc := t_ControlChannelDescription,
158 cell_options := ?,
159 cell_sel_par := ?,
160 rach_control := ?,
161 rest_octets := ?
162 };
Pau Espin Pedrol14b5fea2021-06-21 11:49:43 +0200163
Harald Welte162b1602017-07-16 03:05:02 +0200164
Harald Welte56db5fd2017-07-14 18:25:59 +0200165 /* 44.018 9.1.36 */
166 type record SystemInformationType4 {
Harald Welte56db5fd2017-07-14 18:25:59 +0200167 LocationAreaIdentification lai,
168 CellSelectionParameters cell_sel_par,
169 RachControlParameters rach_control,
Harald Weltead091b62017-07-16 21:03:17 +0200170 ChannelDescriptionTV cbch_chan_desc optional,
Vadim Yanitskiy74e1f6b2020-08-25 03:59:45 +0700171 MobileAllocationTLV cbch_mobile_alloc optional,
Neels Hofmeyra5f0ed22020-07-06 02:39:40 +0200172 SI4RestOctets rest_octets /* see 10.5.2.35 */
Harald Welte56db5fd2017-07-14 18:25:59 +0200173 } with { variant "TAG(cbch_chan_desc, iei = '64'O; cbch_mobile_alloc, iei = '72'O)" };
174
175 /* 44.018 9.1.37 */
176 type record SystemInformationType5 {
Harald Welte56db5fd2017-07-14 18:25:59 +0200177 NeighbourCellDescription bcch_freq_list
178 } with { variant "" };
179
180 /* 44.018 9.1.38 */
181 type record SystemInformationType5bis {
Harald Welte56db5fd2017-07-14 18:25:59 +0200182 NeighbourCellDescription extd_bcch_freq_list
183 } with { variant "" };
184
185 /* 44.018 9.1.39 */
186 type record SystemInformationType5ter {
Harald Welte56db5fd2017-07-14 18:25:59 +0200187 NeighbourCellDescription2 extd_bcch_freq_list
188 } with { variant "" };
189
190 /* 44.018 9.1.40 */
191 type record SystemInformationType6 {
Harald Welte484160b2017-07-28 13:30:24 +0200192 SysinfoCellIdentity cell_id,
Harald Welte56db5fd2017-07-14 18:25:59 +0200193 LocationAreaIdentification lai,
194 CellOptionsSacch cell_options,
195 BIT8 ncc_permitted,
Vadim Yanitskiydbd2f612022-03-10 17:03:26 +0300196 SI6RestOctets rest_octets
Vadim Yanitskiyb7bc2e62020-05-04 21:22:41 +0700197 } with { variant "" };
Harald Welte56db5fd2017-07-14 18:25:59 +0200198
Pau Espin Pedrol28652d82021-02-09 20:20:17 +0100199 /* 44.018 9.1.43a */
200 type record SystemInformationType13 {
201 SI13RestOctets rest_octets
202 } with { variant "" };
203
Harald Weltea4189182017-07-15 19:59:33 +0200204 type union SystemInformationUnion {
Harald Welte56db5fd2017-07-14 18:25:59 +0200205 SystemInformationType1 si1,
206 SystemInformationType2 si2,
207 SystemInformationType2bis si2bis,
208 SystemInformationType2ter si2ter,
Neels Hofmeyrbb277742020-07-06 02:39:58 +0200209 SystemInformationType2quater si2quater,
Harald Welte56db5fd2017-07-14 18:25:59 +0200210 SystemInformationType3 si3,
211 SystemInformationType4 si4,
212 SystemInformationType5 si5,
213 SystemInformationType5bis si5bis,
214 SystemInformationType5ter si5ter,
Harald Welte8c5b3252017-07-15 23:59:49 +0200215 SystemInformationType6 si6,
Pau Espin Pedrol28652d82021-02-09 20:20:17 +0100216 SystemInformationType13 si13,
Harald Welte8c5b3252017-07-15 23:59:49 +0200217 octetstring other
Harald Weltea4189182017-07-15 19:59:33 +0200218 } with { variant "" };
219
220 type record SystemInformation {
Harald Welted2e342f2017-07-16 07:34:13 +0200221 RrHeader header,
Harald Weltea4189182017-07-15 19:59:33 +0200222 SystemInformationUnion payload
223 } with { variant (payload) "CROSSTAG(si1, header.message_type = SYSTEM_INFORMATION_TYPE_1;
Harald Weltea082a692017-07-15 15:58:13 +0200224 si2, header.message_type = SYSTEM_INFORMATION_TYPE_2;
225 si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis;
226 si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter;
Neels Hofmeyrbb277742020-07-06 02:39:58 +0200227 si2quater, header.message_type = SYSTEM_INFORMATION_TYPE_2quater;
Harald Weltea082a692017-07-15 15:58:13 +0200228 si3, header.message_type = SYSTEM_INFORMATION_TYPE_3;
229 si4, header.message_type = SYSTEM_INFORMATION_TYPE_4;
230 si5, header.message_type = SYSTEM_INFORMATION_TYPE_5;
231 si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis;
232 si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter;
233 si6, header.message_type = SYSTEM_INFORMATION_TYPE_6;
Pau Espin Pedrol28652d82021-02-09 20:20:17 +0100234 si13, header.message_type = SYSTEM_INFORMATION_TYPE_13;
Harald Welte8c5b3252017-07-15 23:59:49 +0200235 other, OTHERWISE;
Harald Welte56db5fd2017-07-14 18:25:59 +0200236 )" };
237
Vadim Yanitskiy0217b052020-05-04 23:59:01 +0700238 external function enc_SystemInformationNoPad(in SystemInformation si) return octetstring
Harald Welte56db5fd2017-07-14 18:25:59 +0200239 with { extension "prototype(convert) encode(RAW)" };
240 external function dec_SystemInformation(in octetstring stream) return SystemInformation
241 with { extension "prototype(convert) decode(RAW)" };
242
Vadim Yanitskiy0217b052020-05-04 23:59:01 +0700243 /* Due to a buggy nature of TITAN's padding attributes, we have to apply padding manually. */
244 function enc_SystemInformation(in SystemInformation si) return octetstring
245 {
246 var octetstring si_enc := enc_SystemInformationNoPad(si);
247
248 /* Resulting message length depends on SI Type */
249 select (si.header.message_type) {
250 case (SYSTEM_INFORMATION_TYPE_5,
251 SYSTEM_INFORMATION_TYPE_5bis,
252 SYSTEM_INFORMATION_TYPE_5ter) {
253 /* SACCH: no Rest Octets, return 'as-is' */
254 return si_enc;
255 }
256 case (SYSTEM_INFORMATION_TYPE_6) {
257 /* SACCH: pad to 19 octets, leave room for L1/LAPDm headers */
258 return f_pad_oct(si_enc, 19, '2B'O);
259 }
260 case else {
261 /* BCCH: pad to 23 octets */
262 return f_pad_oct(si_enc, 23, '2B'O);
263 }
264 }
265 }
266
Vadim Yanitskiycb478ec2020-07-11 02:37:17 +0700267 external function dec_SystemInformationSafeBT(in octetstring stream, out SystemInformation si)
268 return integer /* Decoding result: successful (0) or unsuccessful (1) */
269 with { extension "prototype(backtrack) decode(RAW)" };
270
271 /* Some types of System Information (mostly the Rest Octets) are not fully implemented,
272 * so calling the generic dec_SystemInformation() may result in a DTE. This function
273 * additionally checks RR Protocol Discriminator, and should be used in the most cases. */
274 function dec_SystemInformationSafe(in octetstring stream, out SystemInformation si)
275 return integer {
276 /* Try to decode a given octetstring as System Information */
277 if (dec_SystemInformationSafeBT(stream, si) != 0) {
278 log("Failed to decode (RR) System Information: ", stream);
279 return 1;
280 }
281
282 /* Check the protocol discriminator (we expect RR messages) */
283 if (si.header.rr_protocol_discriminator != bit2int('0110'B)) {
284 log("Protocol discriminator is not RR (!= '0110'B): ",
285 si.header.rr_protocol_discriminator);
286 return 1;
287 }
288
289 return 0;
290 }
291
Harald Welte56db5fd2017-07-14 18:25:59 +0200292} with { encode "RAW"; variant "FIELDORDER(msb)" }