Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 1 | /* From GSM08.08 / 3GPP TS 48.008 version 11.7.0 Release 11 */ |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 2 | |
Sylvain Munaut | 12ba778 | 2014-06-16 10:13:40 +0200 | [diff] [blame] | 3 | #pragma once |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 4 | |
| 5 | #include <stdlib.h> |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 6 | #include <stdbool.h> |
| 7 | #include <stdint.h> |
| 8 | #include <osmocom/core/linuxlist.h> |
Neels Hofmeyr | ffad574 | 2018-01-12 05:34:03 +0100 | [diff] [blame] | 9 | #include <osmocom/core/utils.h> |
Pau Espin Pedrol | 392f607 | 2019-11-27 12:07:04 +0100 | [diff] [blame] | 10 | #include <osmocom/core/endian.h> |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 11 | |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 12 | /* |
| 13 | * this is from GSM 03.03 CGI but is copied in GSM 08.08 |
Neels Hofmeyr | a4399c8 | 2018-04-17 02:26:10 +0200 | [diff] [blame] | 14 | * in § 3.2.2.27 for Cell Identifier List. |
| 15 | * See gsm0808_cell_id_discr_name() for a human readable representation. |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 16 | */ |
| 17 | enum 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 Sperling | 6cb8336 | 2018-12-19 19:29:20 +0100 | [diff] [blame] | 22 | CELL_IDENT_LAI = 4, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 23 | 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 Pedrol | b5551ee | 2022-02-16 13:09:32 +0100 | [diff] [blame] | 28 | CELL_IDENT_SAI = 11, |
Pau Espin Pedrol | ca33a71 | 2021-01-05 19:36:48 +0100 | [diff] [blame] | 29 | |
Pau Espin Pedrol | b5551ee | 2022-02-16 13:09:32 +0100 | [diff] [blame] | 30 | /* 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 32 | }; |
Stefan Sperling | 6cb8336 | 2018-12-19 19:29:20 +0100 | [diff] [blame] | 33 | /* 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 35 | |
| 36 | /* GSM 08.06 § 6.3 */ |
| 37 | enum BSSAP_MSG_TYPE { |
| 38 | BSSAP_MSG_BSS_MANAGEMENT = 0x0, |
| 39 | BSSAP_MSG_DTAP = 0x1, |
| 40 | }; |
| 41 | |
| 42 | struct bssmap_header { |
Sylvain Munaut | a074ec4 | 2010-04-28 10:05:29 +0200 | [diff] [blame] | 43 | uint8_t type; |
| 44 | uint8_t length; |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 45 | } __attribute__((packed)); |
| 46 | |
| 47 | struct dtap_header { |
Sylvain Munaut | a074ec4 | 2010-04-28 10:05:29 +0200 | [diff] [blame] | 48 | uint8_t type; |
Pau Espin Pedrol | 392f607 | 2019-11-27 12:07:04 +0100 | [diff] [blame] | 49 | union { |
| 50 | uint8_t link_id; /* Backward compatibility */ |
| 51 | struct { |
Neels Hofmeyr | 534f0f4 | 2020-05-14 17:28:39 +0200 | [diff] [blame] | 52 | #if OSMO_IS_LITTLE_ENDIAN |
Pau Espin Pedrol | 288f9b2 | 2021-02-12 16:32:10 +0100 | [diff] [blame] | 53 | uint8_t dlci_sapi:3, /* enum gsm0406_dlci_sapi */ |
Pau Espin Pedrol | 392f607 | 2019-11-27 12:07:04 +0100 | [diff] [blame] | 54 | dlci_spare:3, |
Pau Espin Pedrol | 288f9b2 | 2021-02-12 16:32:10 +0100 | [diff] [blame] | 55 | dlci_cc:2; |
Pau Espin Pedrol | 392f607 | 2019-11-27 12:07:04 +0100 | [diff] [blame] | 56 | #elif OSMO_IS_BIG_ENDIAN |
Oliver Smith | 0b5c09b | 2023-02-17 10:35:38 +0100 | [diff] [blame] | 57 | /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ |
Pau Espin Pedrol | 288f9b2 | 2021-02-12 16:32:10 +0100 | [diff] [blame] | 58 | uint8_t dlci_cc:2, dlci_spare:3, dlci_sapi:3; |
Neels Hofmeyr | 534f0f4 | 2020-05-14 17:28:39 +0200 | [diff] [blame] | 59 | #endif |
Pau Espin Pedrol | 392f607 | 2019-11-27 12:07:04 +0100 | [diff] [blame] | 60 | }; |
| 61 | }; |
| 62 | uint8_t length; |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 63 | } __attribute__((packed)); |
| 64 | |
Pau Espin Pedrol | 392f607 | 2019-11-27 12:07:04 +0100 | [diff] [blame] | 65 | /* Data Link Control SAPI, GSM 08.06 § 6.3.2, GSM 04.06 § 3.3.3 */ |
| 66 | enum gsm0406_dlci_sapi { |
| 67 | DLCI_SAPI_RR_MM_CC = 0x0, |
| 68 | DLCI_SAPI_SMS = 0x3, |
| 69 | }; |
| 70 | extern const struct value_string gsm0406_dlci_sapi_names[]; |
| 71 | static 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 73 | |
| 74 | enum BSS_MAP_MSG_TYPE { |
| 75 | BSS_MAP_MSG_RESERVED_0 = 0, |
| 76 | |
| 77 | /* ASSIGNMENT MESSAGES */ |
Neels Hofmeyr | 86a5aae | 2019-01-04 01:29:55 +0100 | [diff] [blame] | 78 | BSS_MAP_MSG_ASSIGNMENT_RQST = 1, |
| 79 | BSS_MAP_MSG_ASSIGNMENT_COMPLETE = 2, |
| 80 | BSS_MAP_MSG_ASSIGNMENT_FAILURE = 3, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 81 | BSS_MAP_MSG_CHAN_MOD_RQST = 8, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 82 | |
| 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 96 | 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 100 | |
| 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 119 | BSS_MAP_MSG_REROUTE_CMD = 0x78, |
| 120 | BSS_MAP_MSG_REROUTE_COMPLETE = 0x79, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 121 | |
| 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 132 | BSS_MAP_MSG_RESET_IP_RSRC = 0x3d, |
| 133 | BSS_MAP_MSG_RESET_IP_RSRC_ACK = 0x3e, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 134 | |
| 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 Eversberg | 532b8e9 | 2023-06-09 15:24:59 +0200 | [diff] [blame] | 171 | BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_STATUS = 59, |
| 172 | BSS_MAP_MSG_VGCS_VBS_AREA_CELL_INFO = 60, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 173 | 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 178 | BSS_MAP_MSG_VGCS_ADDL_INFO = 0x60, |
Andreas Eversberg | 532b8e9 | 2023-06-09 15:24:59 +0200 | [diff] [blame] | 179 | BSS_MAP_MSG_VGCS_SMS = 0x61, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 180 | 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 187 | }; |
| 188 | |
Neels Hofmeyr | 86a5aae | 2019-01-04 01:29:55 +0100 | [diff] [blame] | 189 | #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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 193 | enum 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 Pedrol | e8b6913 | 2022-03-18 14:13:49 +0100 | [diff] [blame] | 272 | GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_CDMA2000 = 82, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 273 | GSM0808_IE_RESERVED_5 = 65, |
| 274 | GSM0808_IE_RESERVED_6 = 66, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 275 | 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 Welte | 92107df | 2014-06-21 23:16:20 +0200 | [diff] [blame] | 290 | GSM0808_IE_SMS_TO_VGCS = 0x6e, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 291 | 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 Welte | 92107df | 2014-06-21 23:16:20 +0200 | [diff] [blame] | 319 | GSM0808_IE_LCLS_CORR_NOT_NEEDED = 0x8c, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 320 | 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 Welte | 71806dd | 2019-02-03 00:42:23 +0100 | [diff] [blame] | 329 | 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 Pedrol | 18506c8 | 2019-04-16 15:47:59 +0200 | [diff] [blame] | 334 | |
| 335 | /* Osmocom extensions: */ |
| 336 | GSM0808_IE_OSMO_OSMUX_SUPPORT = 0xf0, |
| 337 | GSM0808_IE_OSMO_OSMUX_CID = 0xf1, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 338 | }; |
| 339 | |
Pau Espin Pedrol | 8b913af | 2021-04-14 16:30:30 +0200 | [diff] [blame] | 340 | /* 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 Hofmeyr | 70aba3f | 2018-03-13 03:40:53 +0100 | [diff] [blame] | 342 | enum 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 Pedrol | 8b913af | 2021-04-14 16:30:30 +0200 | [diff] [blame] | 361 | 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 Hofmeyr | 70aba3f | 2018-03-13 03:40:53 +0100 | [diff] [blame] | 363 | }; |
| 364 | |
Neels Hofmeyr | 6ad50aa | 2019-01-14 20:28:56 +0100 | [diff] [blame] | 365 | /* 3GPP TS 48.008 3.2.2.5 Cause */ |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 366 | enum 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 383 | 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 Alteholz | 0062a5f | 2018-05-15 15:28:55 +0200 | [diff] [blame] | 386 | GSM0808_CAUSE_REQUESTED_OPT_NOT_AUTHORISED = 0x14, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 387 | 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 391 | 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 401 | GSM0808_CAUSE_DTM_HO_SGSN_FAILURE = 0x2a, |
| 402 | GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE = 0x2b, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 403 | 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 408 | 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 412 | GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED = 64, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 413 | 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 419 | 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 425 | GSM0808_CAUSE_DTM_HO_INVALID_PS_IND = 0x56, |
| 426 | GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC = 0x57, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 427 | GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC = 96, |
Thorsten Alteholz | 0062a5f | 2018-05-15 15:28:55 +0200 | [diff] [blame] | 428 | GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTENT = 0x61, |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 429 | GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY = 0x62, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 430 | }; |
| 431 | |
Max | aa93463 | 2018-11-07 13:16:54 +0100 | [diff] [blame] | 432 | /* 3GPP TS 08.08 §3.2.2.5 Cause Class */ |
| 433 | enum 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 444 | /* GSM 08.08 3.2.2.11 Channel Type */ |
| 445 | enum gsm0808_chan_indicator { |
| 446 | GSM0808_CHAN_SPEECH = 1, |
| 447 | GSM0808_CHAN_DATA = 2, |
| 448 | GSM0808_CHAN_SIGN = 3, |
Oliver Smith | 96a8b55 | 2023-01-31 13:01:11 +0100 | [diff] [blame] | 449 | GSM0808_CHAN_SPEECH_CTM_TEXT_TELEPHONY = 4, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 450 | }; |
| 451 | |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 452 | /* GSM 08.08 3.2.2.11 Channel Type */ |
Oliver Smith | 52d8df1 | 2023-01-27 11:21:44 +0100 | [diff] [blame] | 453 | #define GSM0808_DATA_FULL_RPREF GSM0808_DATA_FULL_PREF |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 454 | enum gsm0808_chan_rate_type_data { |
| 455 | GSM0808_DATA_FULL_BM = 0x8, |
| 456 | GSM0808_DATA_HALF_LM = 0x9, |
Oliver Smith | 52d8df1 | 2023-01-27 11:21:44 +0100 | [diff] [blame] | 457 | GSM0808_DATA_FULL_PREF = 0xa, |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 458 | 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 465 | /* GSM 08.08 3.2.2.11 Channel Type */ |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 466 | enum 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 Munaut | 8667f7a | 2019-02-14 15:59:03 +0100 | [diff] [blame] | 477 | /* GSM 08.08 3.2.2.11 Channel Type */ |
| 478 | enum 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 Hofmeyr | 87e4550 | 2017-06-20 00:17:59 +0200 | [diff] [blame] | 491 | /*! GSM 08.08 3.2.2.11 Channel Type |
Philipp Maier | 890f1f5 | 2017-06-16 16:59:06 +0200 | [diff] [blame] | 492 | * (see also 3GPP TS 48.008, section 3.2.2.11) */ |
Holger Hans Peter Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 493 | enum gsm0808_permitted_speech { |
Philipp Maier | 890f1f5 | 2017-06-16 16:59:06 +0200 | [diff] [blame] | 494 | GSM0808_PERM_FR1 = 0x01, /*!< GSM FR */ |
| 495 | GSM0808_PERM_FR2 = 0x11, /*!< GSM EFR */ |
| 496 | GSM0808_PERM_FR3 = 0x21, /*!< FR AMR */ |
Philipp Maier | da38203 | 2017-06-01 12:11:56 +0200 | [diff] [blame] | 497 | GSM0808_PERM_FR4 = 0x41, /*!< OFR AMR-WB */ |
| 498 | GSM0808_PERM_FR5 = 0x42, /*!< FR AMR-WB */ |
Philipp Maier | 890f1f5 | 2017-06-16 16:59:06 +0200 | [diff] [blame] | 499 | 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 Maier | da38203 | 2017-06-01 12:11:56 +0200 | [diff] [blame] | 502 | GSM0808_PERM_HR4 = 0x46, /*!< OHR AMR-WB */ |
| 503 | GSM0808_PERM_HR6 = 0x45, /*!< OHR AMR */ |
| 504 | }; |
| 505 | |
Oliver Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 506 | /* 3GPP TS 48.008 3.2.2.11 Channel Type |
| 507 | * Transparent: Data Rate */ |
| 508 | enum gsm0808_data_rate_transp { |
Oliver Smith | 1447100 | 2023-03-03 10:00:29 +0100 | [diff] [blame] | 509 | 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 Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 518 | }; |
| 519 | |
| 520 | /* 3GPP TS 48.008 3.2.2.11 Channel Type |
| 521 | * Non-Transparent: Radio Interface Data Rate (preferred) */ |
| 522 | enum gsm0808_data_rate_non_transp { |
| 523 | GSM0808_DATA_RATE_NON_TRANSP_12000_6000 = 0x00, |
Oliver Smith | 1447100 | 2023-03-03 10:00:29 +0100 | [diff] [blame] | 524 | 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 Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 529 | }; |
| 530 | |
| 531 | /* 3GPP TS 48.008 3.2.2.11 Channel Type |
| 532 | * Non-Transparent: Allowed Radio Interface Data Rate (all possible allowed) */ |
| 533 | enum gsm0808_data_rate_allowed_r_if { |
Oliver Smith | 1447100 | 2023-03-03 10:00:29 +0100 | [diff] [blame] | 534 | 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 Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 540 | }; |
| 541 | |
Philipp Maier | cdd0581 | 2018-07-12 18:21:07 +0200 | [diff] [blame] | 542 | extern const struct value_string gsm0808_permitted_speech_names[]; |
| 543 | static inline const char *gsm0808_permitted_speech_name(enum gsm0808_permitted_speech val) |
| 544 | { return get_value_string(gsm0808_permitted_speech_names, val); } |
| 545 | |
Neels Hofmeyr | 87e4550 | 2017-06-20 00:17:59 +0200 | [diff] [blame] | 546 | /*! 3GPP TS 48.008, 3.2.2.103 Speech Codec Type */ |
Philipp Maier | da38203 | 2017-06-01 12:11:56 +0200 | [diff] [blame] | 547 | enum 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 Freyther | ebaed74 | 2010-04-15 03:14:51 +0200 | [diff] [blame] | 558 | }; |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 559 | |
Vadim Yanitskiy | f93ef0c | 2023-07-25 03:23:08 +0700 | [diff] [blame] | 560 | /* 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 Hofmeyr | ffad574 | 2018-01-12 05:34:03 +0100 | [diff] [blame] | 566 | extern const struct value_string gsm0808_speech_codec_type_names[]; |
| 567 | static 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 Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 570 | /* GSM 08.08 3.2.2.44 Chosen Encryption Algorithm */ |
| 571 | enum 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 Pedrol | f2cda62 | 2018-07-06 17:16:41 +0200 | [diff] [blame] | 581 | extern const struct value_string gsm0808_chosen_enc_alg_names[]; |
Harald Welte | c8585cf | 2014-06-21 22:28:12 +0200 | [diff] [blame] | 582 | |
| 583 | /* GSM 08.08 3.2.2.85 Paging Information */ |
| 584 | enum gsm0808_paging_info { |
| 585 | GSM0808_PAGINF_FOR_MT_CALL = 0x00, |
| 586 | GSM0808_PAGINF_FOR_SMS = 0x01, |
| 587 | GSM0808_PAGINF_FOR_USSD = 0x02, |
| 588 | }; |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 589 | |
Neels Hofmeyr | aafa2b3 | 2022-08-08 18:43:50 +0200 | [diff] [blame] | 590 | /*! 3GPP TS 48.008 3.2.2.104 Speech Codec. |
| 591 | * Valid if (fi || pi || pt) == true, otherwise ignore. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 592 | struct gsm0808_speech_codec { |
Neels Hofmeyr | aafa2b3 | 2022-08-08 18:43:50 +0200 | [diff] [blame] | 593 | /*! Full IP: AoIP with compressed speech via RTP/UDP/IP. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 594 | bool fi; |
Neels Hofmeyr | aafa2b3 | 2022-08-08 18:43:50 +0200 | [diff] [blame] | 595 | /*! PCMoIP: PCM over A-Interface via RTP/UPD/IP. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 596 | bool pi; |
Neels Hofmeyr | aafa2b3 | 2022-08-08 18:43:50 +0200 | [diff] [blame] | 597 | /*! PCMoTDM: PCM over A-Interface with TDM as transport. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 598 | bool pt; |
Neels Hofmeyr | aafa2b3 | 2022-08-08 18:43:50 +0200 | [diff] [blame] | 599 | /*! TFO (Inband Tandem Free Operation). Only valid if (pi || pt) == true. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 600 | bool tf; |
Neels Hofmeyr | 4ad3cb1 | 2019-09-04 21:43:03 +0200 | [diff] [blame] | 601 | /*! See enum gsm0808_speech_codec_type. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 602 | uint8_t type; |
Neels Hofmeyr | 4ad3cb1 | 2019-09-04 21:43:03 +0200 | [diff] [blame] | 603 | /*! For examples, see enum gsm0808_speech_codec_defaults. */ |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 604 | uint16_t cfg; |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 605 | }; |
| 606 | |
Neels Hofmeyr | 87e4550 | 2017-06-20 00:17:59 +0200 | [diff] [blame] | 607 | /*! Default speech codec configurations: Some codecs specified with |
Philipp Maier | a9b9276 | 2017-06-02 11:25:28 +0200 | [diff] [blame] | 608 | * 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 Maier | 7e27b14 | 2018-03-22 17:26:46 +0100 | [diff] [blame] | 613 | * 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 Maier | a9b9276 | 2017-06-02 11:25:28 +0200 | [diff] [blame] | 615 | * |
| 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 Hofmeyr | 70093f2 | 2022-09-06 04:52:45 +0200 | [diff] [blame] | 618 | * 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 Maier | a9b9276 | 2017-06-02 11:25:28 +0200 | [diff] [blame] | 656 | enum gsm0808_speech_codec_defaults { |
Philipp Maier | 7e27b14 | 2018-03-22 17:26:46 +0100 | [diff] [blame] | 657 | GSM0808_SC_CFG_DEFAULT_FR_AMR = 0x57ff, |
Philipp Maier | a9b9276 | 2017-06-02 11:25:28 +0200 | [diff] [blame] | 658 | GSM0808_SC_CFG_DEFAULT_HR_AMR = 0x073f, |
Philipp Maier | 7e27b14 | 2018-03-22 17:26:46 +0100 | [diff] [blame] | 659 | GSM0808_SC_CFG_DEFAULT_OHR_AMR = 0x57ff, |
Philipp Maier | a9b9276 | 2017-06-02 11:25:28 +0200 | [diff] [blame] | 660 | GSM0808_SC_CFG_DEFAULT_FR_AMR_WB = 0x01, |
Philipp Maier | 4b081b1 | 2018-09-13 15:01:55 +0200 | [diff] [blame] | 661 | GSM0808_SC_CFG_DEFAULT_OFR_AMR_WB = 0x15, |
Philipp Maier | a9b9276 | 2017-06-02 11:25:28 +0200 | [diff] [blame] | 662 | GSM0808_SC_CFG_DEFAULT_OHR_AMR_WB = 0x01, |
| 663 | }; |
| 664 | |
Neels Hofmeyr | 70093f2 | 2022-09-06 04:52:45 +0200 | [diff] [blame] | 665 | /*! Default speech codec configurations broken down by rate. |
Philipp Maier | 5f2eb15 | 2018-09-19 13:40:21 +0200 | [diff] [blame] | 666 | * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for |
Neels Hofmeyr | 70093f2 | 2022-09-06 04:52:45 +0200 | [diff] [blame] | 667 | * the Adaptive Multi-Rate Codec Types. |
| 668 | * |
| 669 | * Set all Sn bits that have this rate listed as active. |
| 670 | */ |
Philipp Maier | 5f2eb15 | 2018-09-19 13:40:21 +0200 | [diff] [blame] | 671 | enum 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 Hofmeyr | 70093f2 | 2022-09-06 04:52:45 +0200 | [diff] [blame] | 682 | /*! Single speech codec configurations broken down by rate. |
Philipp Maier | 3713af8 | 2019-02-27 16:48:25 +0100 | [diff] [blame] | 683 | * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for |
Neels Hofmeyr | 70093f2 | 2022-09-06 04:52:45 +0200 | [diff] [blame] | 684 | * the Adaptive Multi-Rate Codec Types. |
| 685 | * |
| 686 | * Set bit Sn (S0 = 0x01), where Sn is identified by a descriptive name. |
| 687 | */ |
Philipp Maier | 3713af8 | 2019-02-27 16:48:25 +0100 | [diff] [blame] | 688 | enum 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 Hofmeyr | 593d20d | 2022-09-07 02:26:47 +0200 | [diff] [blame] | 699 | /* 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 | */ |
| 704 | enum 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 | }; |
| 714 | extern const struct value_string gsm0808_amr_mode_names[]; |
| 715 | static 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 | |
| 720 | extern const uint8_t gsm0808_amr_modes_from_cfg[2][16]; |
| 721 | |
Philipp Maier | 6f725d6 | 2017-03-24 18:03:17 +0100 | [diff] [blame] | 722 | /* 3GPP TS 48.008 3.2.2.103 Speech Codec List */ |
| 723 | #define SPEECH_CODEC_MAXLEN 255 |
| 724 | struct gsm0808_speech_codec_list { |
| 725 | struct gsm0808_speech_codec codec[SPEECH_CODEC_MAXLEN]; |
| 726 | uint8_t len; |
| 727 | }; |
Philipp Maier | e0c6530 | 2017-03-28 17:05:40 +0200 | [diff] [blame] | 728 | |
Oliver Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 729 | /* 3GPP TS 48.008 3.2.2.11 Channel Type |
| 730 | * Asymmetry Preference (used for data, non-transparent service) */ |
| 731 | enum 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 Maier | e0c6530 | 2017-03-28 17:05:40 +0200 | [diff] [blame] | 738 | /* 3GPP TS 48.008 3.2.2.11 Channel Type */ |
| 739 | #define CH_TYPE_PERM_SPCH_MAXLEN 9 |
| 740 | struct gsm0808_channel_type { |
| 741 | uint8_t ch_indctr; |
| 742 | uint8_t ch_rate_type; |
Oliver Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 743 | |
| 744 | /* Speech only */ |
Philipp Maier | e0c6530 | 2017-03-28 17:05:40 +0200 | [diff] [blame] | 745 | uint8_t perm_spch[CH_TYPE_PERM_SPCH_MAXLEN]; |
| 746 | unsigned int perm_spch_len; |
Oliver Smith | f047a4a | 2023-01-31 13:10:03 +0100 | [diff] [blame] | 747 | |
| 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 Maier | e0c6530 | 2017-03-28 17:05:40 +0200 | [diff] [blame] | 755 | }; |
Philipp Maier | 14e76b9 | 2017-03-28 18:36:52 +0200 | [diff] [blame] | 756 | |
| 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 |
| 760 | struct 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 Maier | 783047e | 2017-03-29 11:35:50 +0200 | [diff] [blame] | 766 | |
Philipp Maier | 783047e | 2017-03-29 11:35:50 +0200 | [diff] [blame] | 767 | #define CELL_ID_LIST_LAC_MAXLEN 127 |
Stefan Sperling | 11a4d9d | 2018-02-15 18:28:04 +0100 | [diff] [blame] | 768 | /*! |
| 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 Maier | 783047e | 2017-03-29 11:35:50 +0200 | [diff] [blame] | 774 | struct 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 Welte | 2f51684 | 2018-05-29 19:21:03 +0200 | [diff] [blame] | 779 | |
| 780 | /* TS 48.008 3.2.2.116 */ |
| 781 | enum 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, |
Max | 961db7c | 2018-11-08 11:40:23 +0100 | [diff] [blame] | 788 | GSM0808_LCLS_CFG_NA = 0xFF |
Harald Welte | 2f51684 | 2018-05-29 19:21:03 +0200 | [diff] [blame] | 789 | }; |
| 790 | |
| 791 | /* TS 48.008 3.2.2.117 */ |
| 792 | enum 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, |
Max | 961db7c | 2018-11-08 11:40:23 +0100 | [diff] [blame] | 798 | GSM0808_LCLS_CSC_NA = 0xFF |
Harald Welte | 2f51684 | 2018-05-29 19:21:03 +0200 | [diff] [blame] | 799 | }; |
| 800 | |
| 801 | /* TS 48.008 3.2.2.119 */ |
| 802 | enum 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, |
Max | 961db7c | 2018-11-08 11:40:23 +0100 | [diff] [blame] | 808 | GSM0808_LCLS_STS_NA = 0xFF |
Harald Welte | 2f51684 | 2018-05-29 19:21:03 +0200 | [diff] [blame] | 809 | }; |
Alexander Chemeris | 22630e6 | 2020-05-13 00:44:04 +0300 | [diff] [blame] | 810 | |
| 811 | /* 3GPP TS 48.008 3.2.2.32 Diagnostics */ |
| 812 | struct 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 Smith | 0b5c09b | 2023-02-17 10:35:38 +0100 | [diff] [blame] | 818 | /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ |
Alexander Chemeris | 22630e6 | 2020-05-13 00:44:04 +0300 | [diff] [blame] | 819 | 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)); |