blob: 1e211dc93e0aa0a93cd23c0a54bcff255cc343f7 [file] [log] [blame]
Harald Weltec8585cf2014-06-21 22:28:12 +02001/* From GSM08.08 / 3GPP TS 48.008 version 11.7.0 Release 11 */
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +02002
Sylvain Munaut12ba7782014-06-16 10:13:40 +02003#pragma once
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +02004
5#include <stdlib.h>
Philipp Maier6f725d62017-03-24 18:03:17 +01006#include <stdbool.h>
7#include <stdint.h>
8#include <osmocom/core/linuxlist.h>
Neels Hofmeyrffad5742018-01-12 05:34:03 +01009#include <osmocom/core/utils.h>
Pau Espin Pedrol392f6072019-11-27 12:07:04 +010010#include <osmocom/core/endian.h>
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020011
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020012/*
13 * this is from GSM 03.03 CGI but is copied in GSM 08.08
Neels Hofmeyra4399c82018-04-17 02:26:10 +020014 * in § 3.2.2.27 for Cell Identifier List.
15 * See gsm0808_cell_id_discr_name() for a human readable representation.
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020016 */
17enum CELL_IDENT {
18 CELL_IDENT_WHOLE_GLOBAL = 0,
19 CELL_IDENT_LAC_AND_CI = 1,
20 CELL_IDENT_CI = 2,
21 CELL_IDENT_NO_CELL = 3,
Stefan Sperling6cb83362018-12-19 19:29:20 +010022 CELL_IDENT_LAI = 4,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020023 CELL_IDENT_LAC = 5,
24 CELL_IDENT_BSS = 6,
25 CELL_IDENT_UTRAN_PLMN_LAC_RNC = 8,
26 CELL_IDENT_UTRAN_RNC = 9,
27 CELL_IDENT_UTRAN_LAC_RNC = 10,
Pau Espin Pedrolb5551ee2022-02-16 13:09:32 +010028 CELL_IDENT_SAI = 11,
Pau Espin Pedrolca33a712021-01-05 19:36:48 +010029
Pau Espin Pedrolb5551ee2022-02-16 13:09:32 +010030 /* Not in 03.03 nor 08.08. Place them > 0x0f (discr_id is 4 bits) */
31 CELL_IDENT_WHOLE_GLOBAL_PS = 128, /* CGI + RAC, TS 48.018 8c.1.4.1.1 */
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020032};
Stefan Sperling6cb83362018-12-19 19:29:20 +010033/* Keep this misnamed CELL_IDENT for API backwards compatibility (see OS#3124). */
34#define CELL_IDENT_LAI_AND_LAC CELL_IDENT_LAI
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020035
36/* GSM 08.06 § 6.3 */
37enum BSSAP_MSG_TYPE {
38 BSSAP_MSG_BSS_MANAGEMENT = 0x0,
39 BSSAP_MSG_DTAP = 0x1,
40};
41
42struct bssmap_header {
Sylvain Munauta074ec42010-04-28 10:05:29 +020043 uint8_t type;
44 uint8_t length;
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020045} __attribute__((packed));
46
47struct dtap_header {
Sylvain Munauta074ec42010-04-28 10:05:29 +020048 uint8_t type;
Pau Espin Pedrol392f6072019-11-27 12:07:04 +010049 union {
50 uint8_t link_id; /* Backward compatibility */
51 struct {
Neels Hofmeyr534f0f42020-05-14 17:28:39 +020052#if OSMO_IS_LITTLE_ENDIAN
Pau Espin Pedrol288f9b22021-02-12 16:32:10 +010053 uint8_t dlci_sapi:3, /* enum gsm0406_dlci_sapi */
Pau Espin Pedrol392f6072019-11-27 12:07:04 +010054 dlci_spare:3,
Pau Espin Pedrol288f9b22021-02-12 16:32:10 +010055 dlci_cc:2;
Pau Espin Pedrol392f6072019-11-27 12:07:04 +010056#elif OSMO_IS_BIG_ENDIAN
Oliver Smith0b5c09b2023-02-17 10:35:38 +010057/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
Pau Espin Pedrol288f9b22021-02-12 16:32:10 +010058 uint8_t dlci_cc:2, dlci_spare:3, dlci_sapi:3;
Neels Hofmeyr534f0f42020-05-14 17:28:39 +020059#endif
Pau Espin Pedrol392f6072019-11-27 12:07:04 +010060 };
61 };
62 uint8_t length;
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020063} __attribute__((packed));
64
Pau Espin Pedrol392f6072019-11-27 12:07:04 +010065/* Data Link Control SAPI, GSM 08.06 § 6.3.2, GSM 04.06 § 3.3.3 */
66enum gsm0406_dlci_sapi {
67 DLCI_SAPI_RR_MM_CC = 0x0,
68 DLCI_SAPI_SMS = 0x3,
69};
70extern const struct value_string gsm0406_dlci_sapi_names[];
71static inline const char *gsm0406_dlci_sapi_name(enum gsm0406_dlci_sapi val)
72{ return get_value_string(gsm0406_dlci_sapi_names, val); }
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020073
74enum BSS_MAP_MSG_TYPE {
75 BSS_MAP_MSG_RESERVED_0 = 0,
76
77 /* ASSIGNMENT MESSAGES */
Neels Hofmeyr86a5aae2019-01-04 01:29:55 +010078 BSS_MAP_MSG_ASSIGNMENT_RQST = 1,
79 BSS_MAP_MSG_ASSIGNMENT_COMPLETE = 2,
80 BSS_MAP_MSG_ASSIGNMENT_FAILURE = 3,
Harald Weltec8585cf2014-06-21 22:28:12 +020081 BSS_MAP_MSG_CHAN_MOD_RQST = 8,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +020082
83 /* HANDOVER MESSAGES */
84 BSS_MAP_MSG_HANDOVER_RQST = 16,
85 BSS_MAP_MSG_HANDOVER_REQUIRED = 17,
86 BSS_MAP_MSG_HANDOVER_RQST_ACKNOWLEDGE= 18,
87 BSS_MAP_MSG_HANDOVER_CMD = 19,
88 BSS_MAP_MSG_HANDOVER_COMPLETE = 20,
89 BSS_MAP_MSG_HANDOVER_SUCCEEDED = 21,
90 BSS_MAP_MSG_HANDOVER_FAILURE = 22,
91 BSS_MAP_MSG_HANDOVER_PERFORMED = 23,
92 BSS_MAP_MSG_HANDOVER_CANDIDATE_ENQUIRE = 24,
93 BSS_MAP_MSG_HANDOVER_CANDIDATE_RESPONSE = 25,
94 BSS_MAP_MSG_HANDOVER_REQUIRED_REJECT = 26,
95 BSS_MAP_MSG_HANDOVER_DETECT = 27,
Harald Weltec8585cf2014-06-21 22:28:12 +020096 BSS_MAP_MSG_INT_HANDOVER_REQUIRED = 0x70,
97 BSS_MAP_MSG_INT_HANDOVER_REQUIRED_REJ = 0x71,
98 BSS_MAP_MSG_INT_HANDOVER_CMD = 0x72,
99 BSS_MAP_MSG_INT_HANDOVER_ENQUIRY = 0x73,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200100
101 /* RELEASE MESSAGES */
102 BSS_MAP_MSG_CLEAR_CMD = 32,
103 BSS_MAP_MSG_CLEAR_COMPLETE = 33,
104 BSS_MAP_MSG_CLEAR_RQST = 34,
105 BSS_MAP_MSG_RESERVED_1 = 35,
106 BSS_MAP_MSG_RESERVED_2 = 36,
107 BSS_MAP_MSG_SAPI_N_REJECT = 37,
108 BSS_MAP_MSG_CONFUSION = 38,
109
110 /* OTHER CONNECTION RELATED MESSAGES */
111 BSS_MAP_MSG_SUSPEND = 40,
112 BSS_MAP_MSG_RESUME = 41,
113 BSS_MAP_MSG_CONNECTION_ORIENTED_INFORMATION = 42,
114 BSS_MAP_MSG_PERFORM_LOCATION_RQST = 43,
115 BSS_MAP_MSG_LSA_INFORMATION = 44,
116 BSS_MAP_MSG_PERFORM_LOCATION_RESPONSE = 45,
117 BSS_MAP_MSG_PERFORM_LOCATION_ABORT = 46,
118 BSS_MAP_MSG_COMMON_ID = 47,
Harald Weltec8585cf2014-06-21 22:28:12 +0200119 BSS_MAP_MSG_REROUTE_CMD = 0x78,
120 BSS_MAP_MSG_REROUTE_COMPLETE = 0x79,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200121
122 /* GENERAL MESSAGES */
123 BSS_MAP_MSG_RESET = 48,
124 BSS_MAP_MSG_RESET_ACKNOWLEDGE = 49,
125 BSS_MAP_MSG_OVERLOAD = 50,
126 BSS_MAP_MSG_RESERVED_3 = 51,
127 BSS_MAP_MSG_RESET_CIRCUIT = 52,
128 BSS_MAP_MSG_RESET_CIRCUIT_ACKNOWLEDGE = 53,
129 BSS_MAP_MSG_MSC_INVOKE_TRACE = 54,
130 BSS_MAP_MSG_BSS_INVOKE_TRACE = 55,
131 BSS_MAP_MSG_CONNECTIONLESS_INFORMATION = 58,
Harald Weltec8585cf2014-06-21 22:28:12 +0200132 BSS_MAP_MSG_RESET_IP_RSRC = 0x3d,
133 BSS_MAP_MSG_RESET_IP_RSRC_ACK = 0x3e,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200134
135 /* TERRESTRIAL RESOURCE MESSAGES */
136 BSS_MAP_MSG_BLOCK = 64,
137 BSS_MAP_MSG_BLOCKING_ACKNOWLEDGE = 65,
138 BSS_MAP_MSG_UNBLOCK = 66,
139 BSS_MAP_MSG_UNBLOCKING_ACKNOWLEDGE = 67,
140 BSS_MAP_MSG_CIRCUIT_GROUP_BLOCK = 68,
141 BSS_MAP_MSG_CIRCUIT_GROUP_BLOCKING_ACKNOWLEDGE = 69,
142 BSS_MAP_MSG_CIRCUIT_GROUP_UNBLOCK = 70,
143 BSS_MAP_MSG_CIRCUIT_GROUP_UNBLOCKING_ACKNOWLEDGE = 71,
144 BSS_MAP_MSG_UNEQUIPPED_CIRCUIT = 72,
145 BSS_MAP_MSG_CHANGE_CIRCUIT = 78,
146 BSS_MAP_MSG_CHANGE_CIRCUIT_ACKNOWLEDGE = 79,
147
148 /* RADIO RESOURCE MESSAGES */
149 BSS_MAP_MSG_RESOURCE_RQST = 80,
150 BSS_MAP_MSG_RESOURCE_INDICATION = 81,
151 BSS_MAP_MSG_PAGING = 82,
152 BSS_MAP_MSG_CIPHER_MODE_CMD = 83,
153 BSS_MAP_MSG_CLASSMARK_UPDATE = 84,
154 BSS_MAP_MSG_CIPHER_MODE_COMPLETE = 85,
155 BSS_MAP_MSG_QUEUING_INDICATION = 86,
156 BSS_MAP_MSG_COMPLETE_LAYER_3 = 87,
157 BSS_MAP_MSG_CLASSMARK_RQST = 88,
158 BSS_MAP_MSG_CIPHER_MODE_REJECT = 89,
159 BSS_MAP_MSG_LOAD_INDICATION = 90,
160
161 /* VGCS/VBS */
162 BSS_MAP_MSG_VGCS_VBS_SETUP = 4,
163 BSS_MAP_MSG_VGCS_VBS_SETUP_ACK = 5,
164 BSS_MAP_MSG_VGCS_VBS_SETUP_REFUSE = 6,
165 BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_RQST = 7,
166 BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_RESULT = 28,
167 BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_FAILURE = 29,
168 BSS_MAP_MSG_VGCS_VBS_QUEUING_INDICATION = 30,
169 BSS_MAP_MSG_UPLINK_RQST = 31,
170 BSS_MAP_MSG_UPLINK_RQST_ACKNOWLEDGE = 39,
Andreas Eversberg532b8e92023-06-09 15:24:59 +0200171 BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_STATUS = 59,
172 BSS_MAP_MSG_VGCS_VBS_AREA_CELL_INFO = 60,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200173 BSS_MAP_MSG_UPLINK_RQST_CONFIRMATION = 73,
174 BSS_MAP_MSG_UPLINK_RELEASE_INDICATION = 74,
175 BSS_MAP_MSG_UPLINK_REJECT_CMD = 75,
176 BSS_MAP_MSG_UPLINK_RELEASE_CMD = 76,
177 BSS_MAP_MSG_UPLINK_SEIZED_CMD = 77,
Harald Weltec8585cf2014-06-21 22:28:12 +0200178 BSS_MAP_MSG_VGCS_ADDL_INFO = 0x60,
Andreas Eversberg532b8e92023-06-09 15:24:59 +0200179 BSS_MAP_MSG_VGCS_SMS = 0x61,
Harald Weltec8585cf2014-06-21 22:28:12 +0200180 BSS_MAP_MSG_NOTIFICATION_DATA = 0x62,
181 BSS_MAP_MSG_UPLINK_APP_DATA = 0x63,
182
183 /* LOCAL SWITCHING */
184 BSS_MAP_MSG_LCLS_CONNECT_CTRL = 0x74,
185 BSS_MAP_MSG_LCLS_CONNECT_CTRL_ACK = 0x75,
186 BSS_MAP_MSG_LCLS_NOTIFICATION = 0x76,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200187};
188
Neels Hofmeyr86a5aae2019-01-04 01:29:55 +0100189#define BSS_MAP_MSG_ASSIGMENT_RQST BSS_MAP_MSG_ASSIGNMENT_RQST
190#define BSS_MAP_MSG_ASSIGMENT_COMPLETE BSS_MAP_MSG_ASSIGNMENT_COMPLETE
191#define BSS_MAP_MSG_ASSIGMENT_FAILURE BSS_MAP_MSG_ASSIGNMENT_FAILURE
192
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200193enum GSM0808_IE_CODING {
194 GSM0808_IE_CIRCUIT_IDENTITY_CODE = 1,
195 GSM0808_IE_RESERVED_0 = 2,
196 GSM0808_IE_RESOURCE_AVAILABLE = 3,
197 GSM0808_IE_CAUSE = 4,
198 GSM0808_IE_CELL_IDENTIFIER = 5,
199 GSM0808_IE_PRIORITY = 6,
200 GSM0808_IE_LAYER_3_HEADER_INFORMATION = 7,
201 GSM0808_IE_IMSI = 8,
202 GSM0808_IE_TMSI = 9,
203 GSM0808_IE_ENCRYPTION_INFORMATION = 10,
204 GSM0808_IE_CHANNEL_TYPE = 11,
205 GSM0808_IE_PERIODICITY = 12,
206 GSM0808_IE_EXTENDED_RESOURCE_INDICATOR = 13,
207 GSM0808_IE_NUMBER_OF_MSS = 14,
208 GSM0808_IE_RESERVED_1 = 15,
209 GSM0808_IE_RESERVED_2 = 16,
210 GSM0808_IE_RESERVED_3 = 17,
211 GSM0808_IE_CLASSMARK_INFORMATION_T2 = 18,
212 GSM0808_IE_CLASSMARK_INFORMATION_T3 = 19,
213 GSM0808_IE_INTERFERENCE_BAND_TO_USE = 20,
214 GSM0808_IE_RR_CAUSE = 21,
215 GSM0808_IE_RESERVED_4 = 22,
216 GSM0808_IE_LAYER_3_INFORMATION = 23,
217 GSM0808_IE_DLCI = 24,
218 GSM0808_IE_DOWNLINK_DTX_FLAG = 25,
219 GSM0808_IE_CELL_IDENTIFIER_LIST = 26,
220 GSM0808_IE_RESPONSE_RQST = 27,
221 GSM0808_IE_RESOURCE_INDICATION_METHOD = 28,
222 GSM0808_IE_CLASSMARK_INFORMATION_TYPE_1 = 29,
223 GSM0808_IE_CIRCUIT_IDENTITY_CODE_LIST = 30,
224 GSM0808_IE_DIAGNOSTIC = 31,
225 GSM0808_IE_LAYER_3_MESSAGE_CONTENTS = 32,
226 GSM0808_IE_CHOSEN_CHANNEL = 33,
227 GSM0808_IE_TOTAL_RESOURCE_ACCESSIBLE = 34,
228 GSM0808_IE_CIPHER_RESPONSE_MODE = 35,
229 GSM0808_IE_CHANNEL_NEEDED = 36,
230 GSM0808_IE_TRACE_TYPE = 37,
231 GSM0808_IE_TRIGGERID = 38,
232 GSM0808_IE_TRACE_REFERENCE = 39,
233 GSM0808_IE_TRANSACTIONID = 40,
234 GSM0808_IE_MOBILE_IDENTITY = 41,
235 GSM0808_IE_OMCID = 42,
236 GSM0808_IE_FORWARD_INDICATOR = 43,
237 GSM0808_IE_CHOSEN_ENCR_ALG = 44,
238 GSM0808_IE_CIRCUIT_POOL = 45,
239 GSM0808_IE_CIRCUIT_POOL_LIST = 46,
240 GSM0808_IE_TIME_INDICATION = 47,
241 GSM0808_IE_RESOURCE_SITUATION = 48,
242 GSM0808_IE_CURRENT_CHANNEL_TYPE_1 = 49,
243 GSM0808_IE_QUEUEING_INDICATOR = 50,
244 GSM0808_IE_SPEECH_VERSION = 64,
245 GSM0808_IE_ASSIGNMENT_REQUIREMENT = 51,
246 GSM0808_IE_TALKER_FLAG = 53,
247 GSM0808_IE_CONNECTION_RELEASE_RQSTED = 54,
248 GSM0808_IE_GROUP_CALL_REFERENCE = 55,
249 GSM0808_IE_EMLPP_PRIORITY = 56,
250 GSM0808_IE_CONFIG_EVO_INDI = 57,
251 GSM0808_IE_OLD_BSS_TO_NEW_BSS_INFORMATION = 58,
252 GSM0808_IE_LSA_IDENTIFIER = 59,
253 GSM0808_IE_LSA_IDENTIFIER_LIST = 60,
254 GSM0808_IE_LSA_INFORMATION = 61,
255 GSM0808_IE_LCS_QOS = 62,
256 GSM0808_IE_LSA_ACCESS_CTRL_SUPPR = 63,
257 GSM0808_IE_LCS_PRIORITY = 67,
258 GSM0808_IE_LOCATION_TYPE = 68,
259 GSM0808_IE_LOCATION_ESTIMATE = 69,
260 GSM0808_IE_POSITIONING_DATA = 70,
261 GSM0808_IE_LCS_CAUSE = 71,
262 GSM0808_IE_LCS_CLIENT_TYPE = 72,
263 GSM0808_IE_APDU = 73,
264 GSM0808_IE_NETWORK_ELEMENT_IDENTITY = 74,
265 GSM0808_IE_GPS_ASSISTANCE_DATA = 75,
266 GSM0808_IE_DECIPHERING_KEYS = 76,
267 GSM0808_IE_RETURN_ERROR_RQST = 77,
268 GSM0808_IE_RETURN_ERROR_CAUSE = 78,
269 GSM0808_IE_SEGMENTATION = 79,
270 GSM0808_IE_SERVICE_HANDOVER = 80,
271 GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_UMTS = 81,
Pau Espin Pedrole8b69132022-03-18 14:13:49 +0100272 GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_CDMA2000 = 82,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200273 GSM0808_IE_RESERVED_5 = 65,
274 GSM0808_IE_RESERVED_6 = 66,
Harald Weltec8585cf2014-06-21 22:28:12 +0200275 GSM0808_IE_GERAN_CLASSMARK = 0x53,
276 GSM0808_IE_GERAN_BSC_CONTAINER = 0x54,
277 GSM0808_IE_NEW_BSS_TO_OLD_BSS_INFO = 0x61,
278 GSM0800_IE_INTER_SYSTEM_INFO = 0x63,
279 GSM0808_IE_SNA_ACCESS_INFO = 0x64,
280 GSM0808_IE_VSTK_RAND_INFO = 0x65,
281 GSM0808_IE_VSTK_INFO = 0x66,
282 GSM0808_IE_PAGING_INFO = 0x67,
283 GSM0808_IE_IMEI = 0x68,
284 GSM0808_IE_VELOCITY_ESTIMATE = 0x55,
285 GSM0808_IE_VGCS_FEATURE_FLAGS = 0x69,
286 GSM0808_IE_TALKER_PRIORITY = 0x6a,
287 GSM0808_IE_EMERGENCY_SET_INDICATION = 0x6b,
288 GSM0808_IE_TALKER_IDENTITY = 0x6c,
289 GSM0808_IE_CELL_ID_LIST_SEGMENT = 0x6d,
Harald Welte92107df2014-06-21 23:16:20 +0200290 GSM0808_IE_SMS_TO_VGCS = 0x6e,
Harald Weltec8585cf2014-06-21 22:28:12 +0200291 GSM0808_IE_VGCS_TALKER_MODE = 0x6f,
292 GSM0808_IE_VGCS_VBS_CELL_STATUS = 0x70,
293 GSM0808_IE_CELL_ID_LIST_SEG_EST_CELLS = 0x71,
294 GSM0808_IE_CELL_ID_LIST_SEG_CELLS_TBE = 0x72,
295 GSM0808_IE_CELL_ID_LIST_SEG_REL_CELLS = 0x73,
296 GSM0808_IE_CELL_ID_LIST_SEG_NE_CELLS = 0x74,
297 GSM0808_IE_GANSS_ASSISTANCE_DATA = 0x75,
298 GSM0808_IE_GANSS_POSITIONING_DATA = 0x76,
299 GSM0808_IE_GANSS_LOCATION_TYPE = 0x77,
300 GSM0808_IE_APP_DATA = 0x78,
301 GSM0808_IE_DATA_IDENTITY = 0x79,
302 GSM0808_IE_APP_DATA_INFO = 0x7a,
303 GSM0808_IE_MSISDN = 0x7b,
304 GSM0808_IE_AOIP_TRASP_ADDR = 0x7c,
305 GSM0808_IE_SPEECH_CODEC_LIST = 0x7d,
306 GSM0808_IE_SPEECH_CODEC = 0x7e,
307 GSM0808_IE_CALL_ID = 0x7f,
308 GSM0808_IE_CALL_ID_LIST = 0x80,
309 GSM0808_IE_A_IF_SEL_FOR_RESET = 0x81,
310 GSM0808_IE_KC_128 = 0x83,
311 GSM0808_IE_CSG_IDENTIFIER = 0x84,
312 GSM0808_IE_REDIR_ATTEMPT_FLAG = 0x85,
313 GSM0808_IE_REROUTE_REJ_CAUSE = 0x86,
314 GSM0808_IE_SEND_SEQ_NUM = 0x87,
315 GSM0808_IE_REROUTE_COMPL_OUTCOME = 0x88,
316 GSM0808_IE_GLOBAL_CALL_REF = 0x89,
317 GSM0808_IE_LCLS_CONFIG = 0x8a,
318 GSM0808_IE_LCLS_CONN_STATUS_CTRL = 0x8b,
Harald Welte92107df2014-06-21 23:16:20 +0200319 GSM0808_IE_LCLS_CORR_NOT_NEEDED = 0x8c,
Harald Weltec8585cf2014-06-21 22:28:12 +0200320 GSM0808_IE_LCLS_BSS_STATUS = 0x8d,
321 GSM0808_IE_LCLS_BREAK_REQ = 0x8e,
322 GSM0808_IE_CSFB_INDICATION = 0x8f,
323 GSM0808_IE_CS_TO_PS_SRVCC = 0x90,
324 GSM0808_IE_SRC_ENB_TO_TGT_ENB_TRANSP = 0x91,
325 GSM0808_IE_CS_TO_PS_SRVCC_IND = 0x92,
326 GSM0808_IE_CN_TO_MS_TRANSP_INFO = 0x93,
327 GSM0808_IE_SELECTED_PLMN_ID = 0x94,
328 GSM0808_IE_LAST_USED_EUTRAN_PLMN_ID = 0x95,
Harald Welte71806dd2019-02-03 00:42:23 +0100329 GSM0808_IE_OLD_LAI = 0x96,
330 GSM0808_IE_ATTACH_INDICATOR = 0x97,
331 GSM0808_IE_SELECTED_OPERATOR = 0x98,
332 GSM0808_IE_PS_REGISTERED_OPERATOR = 0x99,
333 GSM0808_IE_CS_REGISTERED_OPERATOR = 0x9a,
Pau Espin Pedrol18506c82019-04-16 15:47:59 +0200334
335 /* Osmocom extensions: */
336 GSM0808_IE_OSMO_OSMUX_SUPPORT = 0xf0,
337 GSM0808_IE_OSMO_OSMUX_CID = 0xf1,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200338};
339
Pau Espin Pedrol8b913af2021-04-14 16:30:30 +0200340/* 3GPP TS 48.008 3.2.3 Signalling Field Element Coding.
341 See also extra fields in 3.2.2.58 and 3.2.2.80 */
Neels Hofmeyr70aba3f2018-03-13 03:40:53 +0100342enum GSM0808_SIGNALLING_FIELD_ELEMENT_CODING {
343 GSM0808_FE_IE_EXTRA_INFORMATION = 0x01, /*< 3.2.3.1 */
344 GSM0808_FE_IE_CURRENT_CHANNEL_TYPE_2 = 0x02, /*< 3.2.3.2 */
345 GSM0808_FE_IE_TARGET_CELL_RADIO_INFORMATION = 0x03, /*< 3.2.3.3 */
346 GSM0808_FE_IE_GPRS_SUSPEND_INFORMATION = 0x04, /*< 3.2.3.4 */
347 GSM0808_FE_IE_MULTIRATE_CONFIGURATION_INFORMATION = 0x05, /*< 3.2.3.5 */
348 GSM0808_FE_IE_DUAL_TRANSFER_MODE_INFORMATION = 0x06, /*< 3.2.3.6 */
349 GSM0808_FE_IE_INTER_RAT_HANDOVER_INFO = 0x07, /*< 3.2.3.7 */
350 GSM0808_FE_IE_CDMA2000_CAPABILITY_INFORMATION = 0x08, /*< 3.2.3.8 */
351 GSM0808_FE_IE_DOWNLINK_CELL_LOAD_INFORMATION = 0x09, /*< 3.2.3.9 */
352 GSM0808_FE_IE_UPLINK_CELL_LOAD_INFORMATION = 0x0a, /*< 3.2.3.10 */
353 GSM0808_FE_IE_CELL_LOAD_INFORMATION_GROUP = 0x0b, /*< 3.2.3.11 */
354 GSM0808_FE_IE_CELL_LOAD_INFORMATION = 0x0c, /*< 3.2.3.12 */
355 GSM0808_FE_IE_PS_INDICATION = 0x0d, /*< 3.2.3.13 */
356 GSM0808_FE_IE_DTM_HANDOVER_COMMAND_INDICATION = 0x0e, /*< 3.2.3.14 */
357 GSM0808_FE_IE_D_RNTI = 0xfe, /*< 3.2.3.15 */
358 GSM0808_FE_IE_IRAT_MEASUREMENT_CONFIGURATION = 0x0f, /*< 3.2.3.16 */
359 GSM0808_FE_IE_SOURCE_CELL_ID = 0x10, /*< 3.2.3.17 */
360 GSM0808_FE_IE_IRAT_MEASUREMENT_CONFIGURATION_EXTENDED_E_ARFCNS = 0x11, /*< 3.2.3.18 */
Pau Espin Pedrol8b913af2021-04-14 16:30:30 +0200361 GSM0808_FE_IE_VGCS_TALKER_MODE = 0x6f, /*< 3.2.2.93 */
362 GSM0808_FE_IE_LAST_USED_EUTRAN_PLMN_ID = 0x95, /*< 3.2.2.127 */
Neels Hofmeyr70aba3f2018-03-13 03:40:53 +0100363};
364
Neels Hofmeyr6ad50aa2019-01-14 20:28:56 +0100365/* 3GPP TS 48.008 3.2.2.5 Cause */
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200366enum gsm0808_cause {
367 GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE = 0,
368 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE = 1,
369 GSM0808_CAUSE_UPLINK_QUALITY = 2,
370 GSM0808_CAUSE_UPLINK_STRENGTH = 3,
371 GSM0808_CAUSE_DOWNLINK_QUALITY = 4,
372 GSM0808_CAUSE_DOWNLINK_STRENGTH = 5,
373 GSM0808_CAUSE_DISTANCE = 6,
374 GSM0808_CAUSE_O_AND_M_INTERVENTION = 7,
375 GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION = 8,
376 GSM0808_CAUSE_CALL_CONTROL = 9,
377 GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION = 10,
378 GSM0808_CAUSE_HANDOVER_SUCCESSFUL = 11,
379 GSM0808_CAUSE_BETTER_CELL = 12,
380 GSM0808_CAUSE_DIRECTED_RETRY = 13,
381 GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL = 14,
382 GSM0808_CAUSE_TRAFFIC = 15,
Harald Weltec8585cf2014-06-21 22:28:12 +0200383 GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL = 0x10,
384 GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL = 0x11,
385 GSM0808_CAUSE_RELOCATION_TRIGGERED = 0x12,
Thorsten Alteholz0062a5f2018-05-15 15:28:55 +0200386 GSM0808_CAUSE_REQUESTED_OPT_NOT_AUTHORISED = 0x14,
Harald Weltec8585cf2014-06-21 22:28:12 +0200387 GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED = 0x15,
388 GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG = 0x16,
389 GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT = 0x17,
390 GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE = 0x18,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200391 GSM0808_CAUSE_EQUIPMENT_FAILURE = 32,
392 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE = 33,
393 GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE = 34,
394 GSM0808_CAUSE_CCCH_OVERLOAD = 35,
395 GSM0808_CAUSE_PROCESSOR_OVERLOAD = 36,
396 GSM0808_CAUSE_BSS_NOT_EQUIPPED = 37,
397 GSM0808_CAUSE_MS_NOT_EQUIPPED = 38,
398 GSM0808_CAUSE_INVALID_CELL = 39,
399 GSM0808_CAUSE_TRAFFIC_LOAD = 40,
400 GSM0808_CAUSE_PREEMPTION = 41,
Harald Weltec8585cf2014-06-21 22:28:12 +0200401 GSM0808_CAUSE_DTM_HO_SGSN_FAILURE = 0x2a,
402 GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE = 0x2b,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200403 GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE = 48,
404 GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH = 49,
405 GSM0808_CAUSE_SWITCH_CIRCUIT_POOL = 50,
406 GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE = 51,
407 GSM0808_CAUSE_LSA_NOT_ALLOWED = 52,
Harald Weltec8585cf2014-06-21 22:28:12 +0200408 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL = 0x35,
409 GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL = 0x36,
410 GSM0808_CAUSE_INVALID_CSG_CELL = 0x37,
411 GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL = 0x3f,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200412 GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED = 64,
Harald Weltec8585cf2014-06-21 22:28:12 +0200413 GSM0808_CAUSE_GERAN_IU_MODE_FAILURE = 0x41,
414 GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE = 0x42,
415 GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS = 0x43,
416 GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP = 0x44,
417 GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP = 0x45,
418 GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP = 0x46,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200419 GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED = 80,
420 GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS = 81,
421 GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING = 82,
422 GSM0808_CAUSE_INCORRECT_VALUE = 83,
423 GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE = 84,
424 GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT = 85,
Harald Weltec8585cf2014-06-21 22:28:12 +0200425 GSM0808_CAUSE_DTM_HO_INVALID_PS_IND = 0x56,
426 GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC = 0x57,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200427 GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC = 96,
Thorsten Alteholz0062a5f2018-05-15 15:28:55 +0200428 GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTENT = 0x61,
Harald Weltec8585cf2014-06-21 22:28:12 +0200429 GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY = 0x62,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200430};
431
Maxaa934632018-11-07 13:16:54 +0100432/* 3GPP TS 08.08 §3.2.2.5 Cause Class */
433enum gsm0808_cause_class {
434 GSM0808_CAUSE_CLASS_NORM0 = 0,
435 GSM0808_CAUSE_CLASS_NORM1 = 1,
436 GSM0808_CAUSE_CLASS_RES_UNAVAIL = 2,
437 GSM0808_CAUSE_CLASS_SRV_OPT_NA = 3,
438 GSM0808_CAUSE_CLASS_SRV_OPT_NIMPL = 4,
439 GSM0808_CAUSE_CLASS_INVAL = 5,
440 GSM0808_CAUSE_CLASS_PERR = 6,
441 GSM0808_CAUSE_CLASS_INTW = 7,
442};
443
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200444/* GSM 08.08 3.2.2.11 Channel Type */
445enum gsm0808_chan_indicator {
446 GSM0808_CHAN_SPEECH = 1,
447 GSM0808_CHAN_DATA = 2,
448 GSM0808_CHAN_SIGN = 3,
Oliver Smith96a8b552023-01-31 13:01:11 +0100449 GSM0808_CHAN_SPEECH_CTM_TEXT_TELEPHONY = 4,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200450};
451
Harald Weltec8585cf2014-06-21 22:28:12 +0200452/* GSM 08.08 3.2.2.11 Channel Type */
Oliver Smith52d8df12023-01-27 11:21:44 +0100453#define GSM0808_DATA_FULL_RPREF GSM0808_DATA_FULL_PREF
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200454enum gsm0808_chan_rate_type_data {
455 GSM0808_DATA_FULL_BM = 0x8,
456 GSM0808_DATA_HALF_LM = 0x9,
Oliver Smith52d8df12023-01-27 11:21:44 +0100457 GSM0808_DATA_FULL_PREF = 0xa,
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200458 GSM0808_DATA_HALF_PREF = 0xb,
459 GSM0808_DATA_FULL_PREF_NO_CHANGE = 0x1a,
460 GSM0808_DATA_HALF_PREF_NO_CHANGE = 0x1b,
461 GSM0808_DATA_MULTI_MASK = 0x20,
462 GSM0808_DATA_MULTI_MASK_NO_CHANGE = 0x30,
463};
464
Harald Weltec8585cf2014-06-21 22:28:12 +0200465/* GSM 08.08 3.2.2.11 Channel Type */
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200466enum gsm0808_chan_rate_type_speech {
467 GSM0808_SPEECH_FULL_BM = 0x8,
468 GSM0808_SPEECH_HALF_LM = 0x9,
469 GSM0808_SPEECH_FULL_PREF= 0xa,
470 GSM0808_SPEECH_HALF_PREF= 0xb,
471 GSM0808_SPEECH_FULL_PREF_NO_CHANGE = 0x1a,
472 GSM0808_SPEECH_HALF_PREF_NO_CHANGE = 0x1b,
473 GSM0808_SPEECH_PERM = 0xf,
474 GSM0808_SPEECH_PERM_NO_CHANGE = 0x1f,
475};
476
Sylvain Munaut8667f7a2019-02-14 15:59:03 +0100477/* GSM 08.08 3.2.2.11 Channel Type */
478enum gsm0808_chan_rate_type_sign {
479 GSM0808_SIGN_ANY = 0x00,
480 GSM0808_SIGN_SDCCH = 0x01,
481 GSM0808_SIGN_SDCCH_FULL_BM = 0x02,
482 GSM0808_SIGN_SDCCH_HALF_LM = 0x03,
483 GSM0808_SIGN_FULL_BM = 0x08,
484 GSM0808_SIGN_HALF_LM = 0x09,
485 GSM0808_SIGN_FULL_PREF = 0x0a,
486 GSM0808_SIGN_HALF_PREF = 0x0b,
487 GSM0808_SIGN_FULL_PREF_NO_CHANGE = 0x1a,
488 GSM0808_SIGN_HALF_PREF_NO_CHANGE = 0x1b,
489};
490
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200491/*! GSM 08.08 3.2.2.11 Channel Type
Philipp Maier890f1f52017-06-16 16:59:06 +0200492 * (see also 3GPP TS 48.008, section 3.2.2.11) */
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200493enum gsm0808_permitted_speech {
Philipp Maier890f1f52017-06-16 16:59:06 +0200494 GSM0808_PERM_FR1 = 0x01, /*!< GSM FR */
495 GSM0808_PERM_FR2 = 0x11, /*!< GSM EFR */
496 GSM0808_PERM_FR3 = 0x21, /*!< FR AMR */
Philipp Maierda382032017-06-01 12:11:56 +0200497 GSM0808_PERM_FR4 = 0x41, /*!< OFR AMR-WB */
498 GSM0808_PERM_FR5 = 0x42, /*!< FR AMR-WB */
Philipp Maier890f1f52017-06-16 16:59:06 +0200499 GSM0808_PERM_HR1 = GSM0808_PERM_FR1 | 0x4, /*!< GSM HR */
500 GSM0808_PERM_HR2 = GSM0808_PERM_FR2 | 0x4, /*!< (deprecated) */
501 GSM0808_PERM_HR3 = GSM0808_PERM_FR3 | 0x4, /*!< HR AMR */
Philipp Maierda382032017-06-01 12:11:56 +0200502 GSM0808_PERM_HR4 = 0x46, /*!< OHR AMR-WB */
503 GSM0808_PERM_HR6 = 0x45, /*!< OHR AMR */
504};
505
Oliver Smithf047a4a2023-01-31 13:10:03 +0100506/* 3GPP TS 48.008 3.2.2.11 Channel Type
507 * Transparent: Data Rate */
508enum gsm0808_data_rate_transp {
Oliver Smith14471002023-03-03 10:00:29 +0100509 GSM0808_DATA_RATE_TRANSP_32k0 = 0x3a,
510 GSM0808_DATA_RATE_TRANSP_28k8 = 0x39,
511 GSM0808_DATA_RATE_TRANSP_14k4 = 0x18,
512 GSM0808_DATA_RATE_TRANSP_9k6 = 0x10,
513 GSM0808_DATA_RATE_TRANSP_4k8 = 0x11,
514 GSM0808_DATA_RATE_TRANSP_2k4 = 0x12,
515 GSM0808_DATA_RATE_TRANSP_1k2 = 0x13,
516 GSM0808_DATA_RATE_TRANSP_600 = 0x14,
517 GSM0808_DATA_RATE_TRANSP_1200_75 = 0x15,
Oliver Smithf047a4a2023-01-31 13:10:03 +0100518};
519
520/* 3GPP TS 48.008 3.2.2.11 Channel Type
521 * Non-Transparent: Radio Interface Data Rate (preferred) */
522enum gsm0808_data_rate_non_transp {
523 GSM0808_DATA_RATE_NON_TRANSP_12000_6000 = 0x00,
Oliver Smith14471002023-03-03 10:00:29 +0100524 GSM0808_DATA_RATE_NON_TRANSP_43k5 = 0x34,
525 GSM0808_DATA_RATE_NON_TRANSP_29k0 = 0x31,
526 GSM0808_DATA_RATE_NON_TRANSP_14k5 = 0x14,
527 GSM0808_DATA_RATE_NON_TRANSP_12k0 = 0x10,
528 GSM0808_DATA_RATE_NON_TRANSP_6k0 = 0x11,
Oliver Smithf047a4a2023-01-31 13:10:03 +0100529};
530
531/* 3GPP TS 48.008 3.2.2.11 Channel Type
532 * Non-Transparent: Allowed Radio Interface Data Rate (all possible allowed) */
533enum gsm0808_data_rate_allowed_r_if {
Oliver Smith14471002023-03-03 10:00:29 +0100534 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_43k5 = 0x40,
535 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_32k0 = 0x20,
536 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_29k0 = 0x10,
537 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_14k5 = 0x08,
538 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_12k0 = 0x02,
539 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_6k0 = 0x01,
Oliver Smithf047a4a2023-01-31 13:10:03 +0100540};
541
Philipp Maiercdd05812018-07-12 18:21:07 +0200542extern const struct value_string gsm0808_permitted_speech_names[];
543static inline const char *gsm0808_permitted_speech_name(enum gsm0808_permitted_speech val)
544{ return get_value_string(gsm0808_permitted_speech_names, val); }
545
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200546/*! 3GPP TS 48.008, 3.2.2.103 Speech Codec Type */
Philipp Maierda382032017-06-01 12:11:56 +0200547enum gsm0808_speech_codec_type {
548 GSM0808_SCT_FR1 = 0x0, /*!< GSM FR */
549 GSM0808_SCT_FR2 = 0x2, /*!< GSM EFR */
550 GSM0808_SCT_FR3 = 0x3, /*!< FR AMR */
551 GSM0808_SCT_FR4 = 0xc, /*!< OFR AMR-WB */
552 GSM0808_SCT_FR5 = 0x9, /*!< FR AMR-WB */
553 GSM0808_SCT_HR1 = 0x1, /*!< GSM_HR */
554 GSM0808_SCT_HR3 = 0x4, /*!< HR_AMR */
555 GSM0808_SCT_HR4 = 0xd, /*!< OHR AMR-WB */
556 GSM0808_SCT_HR6 = 0xb, /*!< OHR AMR */
557 GSM0808_SCT_CSD = 0xfd, /*!< CSData (see also TS 26.103) */
Holger Hans Peter Freytherebaed742010-04-15 03:14:51 +0200558};
Harald Weltec8585cf2014-06-21 22:28:12 +0200559
Vadim Yanitskiyf93ef0c2023-07-25 03:23:08 +0700560/* Codec Extension (the real Codec Type follows in the next octet).
561 * This value is intentionally not included in gsm0808_speech_codec_type,
562 * because {enc,dec}_speech_codec() functions take care of the extended
563 * encoding internally. It shall not be used in struct gsm0808_speech_codec. */
564#define GSM0808_SCT_EXT 0x0f
565
Neels Hofmeyrffad5742018-01-12 05:34:03 +0100566extern const struct value_string gsm0808_speech_codec_type_names[];
567static inline const char *gsm0808_speech_codec_type_name(enum gsm0808_speech_codec_type val)
568{ return get_value_string(gsm0808_speech_codec_type_names, val); }
569
Harald Weltec8585cf2014-06-21 22:28:12 +0200570/* GSM 08.08 3.2.2.44 Chosen Encryption Algorithm */
571enum gsm0808_chosen_enc_alg {
572 GSM0808_ALG_ID_A5_0 = 0x01,
573 GSM0808_ALG_ID_A5_1 = 0x02,
574 GSM0808_ALG_ID_A5_2 = 0x03,
575 GSM0808_ALG_ID_A5_3 = 0x04,
576 GSM0808_ALG_ID_A5_4 = 0x05,
577 GSM0808_ALG_ID_A5_5 = 0x06,
578 GSM0808_ALG_ID_A5_6 = 0x07,
579 GSM0808_ALG_ID_A5_7 = 0x08,
580};
Pau Espin Pedrolf2cda622018-07-06 17:16:41 +0200581extern const struct value_string gsm0808_chosen_enc_alg_names[];
Harald Weltec8585cf2014-06-21 22:28:12 +0200582
583/* GSM 08.08 3.2.2.85 Paging Information */
584enum gsm0808_paging_info {
585 GSM0808_PAGINF_FOR_MT_CALL = 0x00,
586 GSM0808_PAGINF_FOR_SMS = 0x01,
587 GSM0808_PAGINF_FOR_USSD = 0x02,
588};
Philipp Maier6f725d62017-03-24 18:03:17 +0100589
Neels Hofmeyraafa2b32022-08-08 18:43:50 +0200590/*! 3GPP TS 48.008 3.2.2.104 Speech Codec.
591 * Valid if (fi || pi || pt) == true, otherwise ignore. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100592struct gsm0808_speech_codec {
Neels Hofmeyraafa2b32022-08-08 18:43:50 +0200593 /*! Full IP: AoIP with compressed speech via RTP/UDP/IP. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100594 bool fi;
Neels Hofmeyraafa2b32022-08-08 18:43:50 +0200595 /*! PCMoIP: PCM over A-Interface via RTP/UPD/IP. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100596 bool pi;
Neels Hofmeyraafa2b32022-08-08 18:43:50 +0200597 /*! PCMoTDM: PCM over A-Interface with TDM as transport. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100598 bool pt;
Neels Hofmeyraafa2b32022-08-08 18:43:50 +0200599 /*! TFO (Inband Tandem Free Operation). Only valid if (pi || pt) == true. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100600 bool tf;
Neels Hofmeyr4ad3cb12019-09-04 21:43:03 +0200601 /*! See enum gsm0808_speech_codec_type. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100602 uint8_t type;
Neels Hofmeyr4ad3cb12019-09-04 21:43:03 +0200603 /*! For examples, see enum gsm0808_speech_codec_defaults. */
Philipp Maier6f725d62017-03-24 18:03:17 +0100604 uint16_t cfg;
Philipp Maier6f725d62017-03-24 18:03:17 +0100605};
606
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200607/*! Default speech codec configurations: Some codecs specified with
Philipp Maiera9b92762017-06-02 11:25:28 +0200608 * struct gsm0808_speech_codec, require a configuration (cfg). The following
609 * default configuration will configure the codec (RTP) to match the
610 * configuration that is used on the air interface (Um).
611 *
612 * Default values for FR_AMR, HR_AMR and OHR_AMR:
Philipp Maier7e27b142018-03-22 17:26:46 +0100613 * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for
614 * the Adaptive Multi-Rate Codec Types and 3GPP TS 48.008, Section 3.2.2.103.
Philipp Maiera9b92762017-06-02 11:25:28 +0200615 *
616 * Default values for FR_AMR_WB, OFR_AMR_WB and OHR_AMR_WB:
617 * See also: 3GPP TS 26.103, Table 5.7-1: Allowed Configurations
Neels Hofmeyr70093f22022-09-06 04:52:45 +0200618 * for the Adaptive Multi-Rate - Wideband Codec Types
619 *
620 * This is a copy of 3GPP TS 28.062, Table 7.11.3.1.3-2:
621 *
622 * S0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
623 * 12,20 (x) x x x
624 * 10,20 x x x
625 * 7,95 x x x
626 * 7,40 x x x x
627 * 6,70 x x x x x x
628 * 5,90 x x x x x x x x x x
629 * 5,15
630 * 4,75 x x x x x x x x x x
631 *
632 * OM F F F F F F F F F F F A F A F A
633 *
634 * HR Y Y Y Y Y Y Y Y Y
635 * FR Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
636 *
637 * Each bit allows one Codec Configuration.
638 * E.g. when bit S3 is set, look at column labeled "3", and see that only 6,7k is active in this configuration; it is
639 * "F" forbidden to change in Optimisation Mode, "Y" HR AMR supports this mode, and "Y" FR AMR can also do it.
640 *
641 * This means that whichever configuration is chosen from S0 thru S15, there are never more than four rates active.
642 *
643 * The spec praises S1 as the most desired configuration: "because it leads in all call cases to TFO/TrFO compatible
644 * connections with optimal voice quality." (Since HR AMR supports up to 7.95k, it seems that S14 would be more optimal
645 * voice quality, but it is not marked as supported by HR AMR.)
646 *
647 * For FR_AMR below, the default of 0x57ff means:
648 * 0x57ff = 0101 0111 1111 1111
649 * ^14 ^10 ^0
650 * allow config 0 thru 10, and configs 12 and 14.
651 *
652 * For HR_AMR, drop all those where there is no "Y" in the HR row:
653 * 0x073f = 0000 0111 0011 1111
654 * ^15 ^11 ^6 ^0
655 */
Philipp Maiera9b92762017-06-02 11:25:28 +0200656enum gsm0808_speech_codec_defaults {
Philipp Maier7e27b142018-03-22 17:26:46 +0100657 GSM0808_SC_CFG_DEFAULT_FR_AMR = 0x57ff,
Philipp Maiera9b92762017-06-02 11:25:28 +0200658 GSM0808_SC_CFG_DEFAULT_HR_AMR = 0x073f,
Philipp Maier7e27b142018-03-22 17:26:46 +0100659 GSM0808_SC_CFG_DEFAULT_OHR_AMR = 0x57ff,
Philipp Maiera9b92762017-06-02 11:25:28 +0200660 GSM0808_SC_CFG_DEFAULT_FR_AMR_WB = 0x01,
Philipp Maier4b081b12018-09-13 15:01:55 +0200661 GSM0808_SC_CFG_DEFAULT_OFR_AMR_WB = 0x15,
Philipp Maiera9b92762017-06-02 11:25:28 +0200662 GSM0808_SC_CFG_DEFAULT_OHR_AMR_WB = 0x01,
663};
664
Neels Hofmeyr70093f22022-09-06 04:52:45 +0200665/*! Default speech codec configurations broken down by rate.
Philipp Maier5f2eb152018-09-19 13:40:21 +0200666 * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for
Neels Hofmeyr70093f22022-09-06 04:52:45 +0200667 * the Adaptive Multi-Rate Codec Types.
668 *
669 * Set all Sn bits that have this rate listed as active.
670 */
Philipp Maier5f2eb152018-09-19 13:40:21 +0200671enum gsm0808_speech_codec_rate_defaults {
672 GSM0808_SC_CFG_DEFAULT_AMR_4_75 = 0xff03,
673 GSM0808_SC_CFG_DEFAULT_AMR_5_15 = 0x0000,
674 GSM0808_SC_CFG_DEFAULT_AMR_5_90 = 0xff06,
675 GSM0808_SC_CFG_DEFAULT_AMR_6_70 = 0x3e08,
676 GSM0808_SC_CFG_DEFAULT_AMR_7_40 = 0x0c12,
677 GSM0808_SC_CFG_DEFAULT_AMR_7_95 = 0xc020,
678 GSM0808_SC_CFG_DEFAULT_AMR_10_2 = 0x3040,
679 GSM0808_SC_CFG_DEFAULT_AMR_12_2 = 0xc082
680};
681
Neels Hofmeyr70093f22022-09-06 04:52:45 +0200682/*! Single speech codec configurations broken down by rate.
Philipp Maier3713af82019-02-27 16:48:25 +0100683 * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for
Neels Hofmeyr70093f22022-09-06 04:52:45 +0200684 * the Adaptive Multi-Rate Codec Types.
685 *
686 * Set bit Sn (S0 = 0x01), where Sn is identified by a descriptive name.
687 */
Philipp Maier3713af82019-02-27 16:48:25 +0100688enum gsm0808_speech_codec_rate {
689 GSM0808_SC_CFG_AMR_4_75 = 0x0001,
690 GSM0808_SC_CFG_AMR_4_75_5_90_7_40_12_20 = 0x0002,
691 GSM0808_SC_CFG_AMR_5_90 = 0x0004,
692 GSM0808_SC_CFG_AMR_6_70 = 0x0008,
693 GSM0808_SC_CFG_AMR_7_40 = 0x0010,
694 GSM0808_SC_CFG_AMR_7_95 = 0x0020,
695 GSM0808_SC_CFG_AMR_10_2 = 0x0040,
696 GSM0808_SC_CFG_AMR_12_2 = 0x0080,
697};
698
Neels Hofmeyr593d20d2022-09-07 02:26:47 +0200699/* Bit index of a mode as returned by gsm0808_amr_modes_from_cfg[].
700 * Example:
701 * if (gsm0808_amr_modes_from_cfg[full_rate ? 1 : 0][9] & GSM0808_AMR_MODE_4_75)
702 * printf("S9 supports 4k75");
703 */
704enum gsm0808_amr_mode {
705 GSM0808_AMR_MODE_4_75 = 0,
706 GSM0808_AMR_MODE_5_15,
707 GSM0808_AMR_MODE_5_90,
708 GSM0808_AMR_MODE_6_70,
709 GSM0808_AMR_MODE_7_40,
710 GSM0808_AMR_MODE_7_95,
711 GSM0808_AMR_MODE_10_2,
712 GSM0808_AMR_MODE_12_2,
713};
714extern const struct value_string gsm0808_amr_mode_names[];
715static inline const char *gsm0808_amr_mode_name(enum gsm0808_amr_mode val)
716{
717 return get_value_string(gsm0808_amr_mode_names, val);
718}
719
720extern const uint8_t gsm0808_amr_modes_from_cfg[2][16];
721
Philipp Maier6f725d62017-03-24 18:03:17 +0100722/* 3GPP TS 48.008 3.2.2.103 Speech Codec List */
723#define SPEECH_CODEC_MAXLEN 255
724struct gsm0808_speech_codec_list {
725 struct gsm0808_speech_codec codec[SPEECH_CODEC_MAXLEN];
726 uint8_t len;
727};
Philipp Maiere0c65302017-03-28 17:05:40 +0200728
Oliver Smithf047a4a2023-01-31 13:10:03 +0100729/* 3GPP TS 48.008 3.2.2.11 Channel Type
730 * Asymmetry Preference (used for data, non-transparent service) */
731enum gsm0808_channel_type_asym_pref {
732 GSM0808_CT_ASYM_PREF_NOT_APPLICABLE = 0,
733 GSM0808_CT_ASYM_PREF_UL = 1,
734 GSM0808_CT_ASYM_PREF_DL = 2,
735 GSM0808_CT_ASYM_PREF_SPARE = 3,
736};
737
Philipp Maiere0c65302017-03-28 17:05:40 +0200738/* 3GPP TS 48.008 3.2.2.11 Channel Type */
739#define CH_TYPE_PERM_SPCH_MAXLEN 9
740struct gsm0808_channel_type {
741 uint8_t ch_indctr;
742 uint8_t ch_rate_type;
Oliver Smithf047a4a2023-01-31 13:10:03 +0100743
744 /* Speech only */
Philipp Maiere0c65302017-03-28 17:05:40 +0200745 uint8_t perm_spch[CH_TYPE_PERM_SPCH_MAXLEN];
746 unsigned int perm_spch_len;
Oliver Smithf047a4a2023-01-31 13:10:03 +0100747
748 /* Data only */
749 bool data_transparent;
750 uint8_t data_rate;
751 bool data_rate_allowed_is_set;
752 uint8_t data_rate_allowed;
753 bool data_asym_pref_is_set;
754 enum gsm0808_channel_type_asym_pref data_asym_pref;
Philipp Maiere0c65302017-03-28 17:05:40 +0200755};
Philipp Maier14e76b92017-03-28 18:36:52 +0200756
757/* 3GPP TS 48.008 3.2.2.10 Encryption Information */
758#define ENCRY_INFO_KEY_MAXLEN 252
759#define ENCRY_INFO_PERM_ALGO_MAXLEN 8
760struct gsm0808_encrypt_info {
761 uint8_t perm_algo[ENCRY_INFO_PERM_ALGO_MAXLEN];
762 unsigned int perm_algo_len;
763 uint8_t key[ENCRY_INFO_KEY_MAXLEN];
764 unsigned int key_len;
765};
Philipp Maier783047e2017-03-29 11:35:50 +0200766
Philipp Maier783047e2017-03-29 11:35:50 +0200767#define CELL_ID_LIST_LAC_MAXLEN 127
Stefan Sperling11a4d9d2018-02-15 18:28:04 +0100768/*!
769 * DEPRECATED: This definition of the cell identifier list is
770 * insufficient. It cannot support all types of cell identifiers.
771 * Use struct gsm0808_cell_id_list2 in gsm0808_utils.h instead.
772 *
773 * 3GPP TS 48.008 3.2.2.27 Cell Identifier List */
Philipp Maier783047e2017-03-29 11:35:50 +0200774struct gsm0808_cell_id_list {
775 uint8_t id_discr;
776 uint16_t id_list_lac[CELL_ID_LIST_LAC_MAXLEN];
777 unsigned int id_list_len;
778};
Harald Welte2f516842018-05-29 19:21:03 +0200779
780/* TS 48.008 3.2.2.116 */
781enum gsm0808_lcls_config {
782 GSM0808_LCLS_CFG_BOTH_WAY = 0x00,
783 GSM0808_LCLS_CFG_BOTH_WAY_AND_BICAST_UL = 0x01,
784 GSM0808_LCLS_CFG_BOTH_WAY_AND_SEND_DL = 0x02,
785 GSM0808_LCLS_CFG_BOTH_WAY_AND_SEND_DL_BLOCK_LOCAL_DL = 0x03,
786 GSM0808_LCLS_CFG_BOTH_WAY_AND_BICAST_UL_SEND_DL = 0x04,
787 GSM0808_LCLS_CFG_BOTH_WAY_AND_BICAST_UL_SEND_DL_BLOCK_LOCAL_DL = 0x05,
Max961db7c2018-11-08 11:40:23 +0100788 GSM0808_LCLS_CFG_NA = 0xFF
Harald Welte2f516842018-05-29 19:21:03 +0200789};
790
791/* TS 48.008 3.2.2.117 */
792enum gsm0808_lcls_control {
793 GSM0808_LCLS_CSC_CONNECT = 0x00,
794 GSM0808_LCLS_CSC_DO_NOT_CONNECT = 0x01,
795 GSM0808_LCLS_CSC_RELEASE_LCLS = 0x02,
796 GSM0808_LCLS_CSC_BICAST_UL_AT_HANDOVER = 0x03,
797 GSM0808_LCLS_CSC_BICAST_UL_AND_RECV_DL_AT_HANDOVER = 0x04,
Max961db7c2018-11-08 11:40:23 +0100798 GSM0808_LCLS_CSC_NA = 0xFF
Harald Welte2f516842018-05-29 19:21:03 +0200799};
800
801/* TS 48.008 3.2.2.119 */
802enum gsm0808_lcls_status {
803 GSM0808_LCLS_STS_NOT_YET_LS = 0x00,
804 GSM0808_LCLS_STS_NOT_POSSIBLE_LS = 0x01,
805 GSM0808_LCLS_STS_NO_LONGER_LS = 0x02,
806 GSM0808_LCLS_STS_REQ_LCLS_NOT_SUPP = 0x03,
807 GSM0808_LCLS_STS_LOCALLY_SWITCHED = 0x04,
Max961db7c2018-11-08 11:40:23 +0100808 GSM0808_LCLS_STS_NA = 0xFF
Harald Welte2f516842018-05-29 19:21:03 +0200809};
Alexander Chemeris22630e62020-05-13 00:44:04 +0300810
811/* 3GPP TS 48.008 3.2.2.32 Diagnostics */
812struct gsm0808_diagnostics {
813 uint8_t error_pointer_octet;
814#if OSMO_IS_LITTLE_ENDIAN
815 uint8_t error_pointer_bit_spare:4,
816 error_pointer_bit:4;
817#elif OSMO_IS_BIG_ENDIAN
Oliver Smith0b5c09b2023-02-17 10:35:38 +0100818/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
Alexander Chemeris22630e62020-05-13 00:44:04 +0300819 uint8_t error_pointer_bit:4, error_pointer_bit_spare:4;
820#endif
821 uint8_t msg[0]; /*! received message which provoked the error */
822} __attribute__((packed));