/* From GSM08.08 / 3GPP TS 48.008 version 11.7.0 Release 11 */ #pragma once #include #include #include #include #include #include /* * this is from GSM 03.03 CGI but is copied in GSM 08.08 * in § 3.2.2.27 for Cell Identifier List. * See gsm0808_cell_id_discr_name() for a human readable representation. */ enum CELL_IDENT { CELL_IDENT_WHOLE_GLOBAL = 0, CELL_IDENT_LAC_AND_CI = 1, CELL_IDENT_CI = 2, CELL_IDENT_NO_CELL = 3, CELL_IDENT_LAI = 4, CELL_IDENT_LAC = 5, CELL_IDENT_BSS = 6, CELL_IDENT_UTRAN_PLMN_LAC_RNC = 8, CELL_IDENT_UTRAN_RNC = 9, CELL_IDENT_UTRAN_LAC_RNC = 10, CELL_IDENT_SAI = 11, /* Not in 03.03 nor 08.08. Place them > 0x0f (discr_id is 4 bits) */ CELL_IDENT_WHOLE_GLOBAL_PS = 128, /* CGI + RAC, TS 48.018 8c.1.4.1.1 */ }; /* Keep this misnamed CELL_IDENT for API backwards compatibility (see OS#3124). */ #define CELL_IDENT_LAI_AND_LAC CELL_IDENT_LAI /* GSM 08.06 § 6.3 */ enum BSSAP_MSG_TYPE { BSSAP_MSG_BSS_MANAGEMENT = 0x0, BSSAP_MSG_DTAP = 0x1, }; struct bssmap_header { uint8_t type; uint8_t length; } __attribute__((packed)); struct dtap_header { uint8_t type; union { uint8_t link_id; /* Backward compatibility */ struct { #if OSMO_IS_LITTLE_ENDIAN uint8_t dlci_sapi:3, /* enum gsm0406_dlci_sapi */ dlci_spare:3, dlci_cc:2; #elif OSMO_IS_BIG_ENDIAN /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ uint8_t dlci_cc:2, dlci_spare:3, dlci_sapi:3; #endif }; }; uint8_t length; } __attribute__((packed)); /* Data Link Control SAPI, GSM 08.06 § 6.3.2, GSM 04.06 § 3.3.3 */ enum gsm0406_dlci_sapi { DLCI_SAPI_RR_MM_CC = 0x0, DLCI_SAPI_SMS = 0x3, }; extern const struct value_string gsm0406_dlci_sapi_names[]; static inline const char *gsm0406_dlci_sapi_name(enum gsm0406_dlci_sapi val) { return get_value_string(gsm0406_dlci_sapi_names, val); } enum BSS_MAP_MSG_TYPE { BSS_MAP_MSG_RESERVED_0 = 0, /* ASSIGNMENT MESSAGES */ BSS_MAP_MSG_ASSIGNMENT_RQST = 1, BSS_MAP_MSG_ASSIGNMENT_COMPLETE = 2, BSS_MAP_MSG_ASSIGNMENT_FAILURE = 3, BSS_MAP_MSG_CHAN_MOD_RQST = 8, /* HANDOVER MESSAGES */ BSS_MAP_MSG_HANDOVER_RQST = 16, BSS_MAP_MSG_HANDOVER_REQUIRED = 17, BSS_MAP_MSG_HANDOVER_RQST_ACKNOWLEDGE= 18, BSS_MAP_MSG_HANDOVER_CMD = 19, BSS_MAP_MSG_HANDOVER_COMPLETE = 20, BSS_MAP_MSG_HANDOVER_SUCCEEDED = 21, BSS_MAP_MSG_HANDOVER_FAILURE = 22, BSS_MAP_MSG_HANDOVER_PERFORMED = 23, BSS_MAP_MSG_HANDOVER_CANDIDATE_ENQUIRE = 24, BSS_MAP_MSG_HANDOVER_CANDIDATE_RESPONSE = 25, BSS_MAP_MSG_HANDOVER_REQUIRED_REJECT = 26, BSS_MAP_MSG_HANDOVER_DETECT = 27, BSS_MAP_MSG_INT_HANDOVER_REQUIRED = 0x70, BSS_MAP_MSG_INT_HANDOVER_REQUIRED_REJ = 0x71, BSS_MAP_MSG_INT_HANDOVER_CMD = 0x72, BSS_MAP_MSG_INT_HANDOVER_ENQUIRY = 0x73, /* RELEASE MESSAGES */ BSS_MAP_MSG_CLEAR_CMD = 32, BSS_MAP_MSG_CLEAR_COMPLETE = 33, BSS_MAP_MSG_CLEAR_RQST = 34, BSS_MAP_MSG_RESERVED_1 = 35, BSS_MAP_MSG_RESERVED_2 = 36, BSS_MAP_MSG_SAPI_N_REJECT = 37, BSS_MAP_MSG_CONFUSION = 38, /* OTHER CONNECTION RELATED MESSAGES */ BSS_MAP_MSG_SUSPEND = 40, BSS_MAP_MSG_RESUME = 41, BSS_MAP_MSG_CONNECTION_ORIENTED_INFORMATION = 42, BSS_MAP_MSG_PERFORM_LOCATION_RQST = 43, BSS_MAP_MSG_LSA_INFORMATION = 44, BSS_MAP_MSG_PERFORM_LOCATION_RESPONSE = 45, BSS_MAP_MSG_PERFORM_LOCATION_ABORT = 46, BSS_MAP_MSG_COMMON_ID = 47, BSS_MAP_MSG_REROUTE_CMD = 0x78, BSS_MAP_MSG_REROUTE_COMPLETE = 0x79, /* GENERAL MESSAGES */ BSS_MAP_MSG_RESET = 48, BSS_MAP_MSG_RESET_ACKNOWLEDGE = 49, BSS_MAP_MSG_OVERLOAD = 50, BSS_MAP_MSG_RESERVED_3 = 51, BSS_MAP_MSG_RESET_CIRCUIT = 52, BSS_MAP_MSG_RESET_CIRCUIT_ACKNOWLEDGE = 53, BSS_MAP_MSG_MSC_INVOKE_TRACE = 54, BSS_MAP_MSG_BSS_INVOKE_TRACE = 55, BSS_MAP_MSG_CONNECTIONLESS_INFORMATION = 58, BSS_MAP_MSG_RESET_IP_RSRC = 0x3d, BSS_MAP_MSG_RESET_IP_RSRC_ACK = 0x3e, /* TERRESTRIAL RESOURCE MESSAGES */ BSS_MAP_MSG_BLOCK = 64, BSS_MAP_MSG_BLOCKING_ACKNOWLEDGE = 65, BSS_MAP_MSG_UNBLOCK = 66, BSS_MAP_MSG_UNBLOCKING_ACKNOWLEDGE = 67, BSS_MAP_MSG_CIRCUIT_GROUP_BLOCK = 68, BSS_MAP_MSG_CIRCUIT_GROUP_BLOCKING_ACKNOWLEDGE = 69, BSS_MAP_MSG_CIRCUIT_GROUP_UNBLOCK = 70, BSS_MAP_MSG_CIRCUIT_GROUP_UNBLOCKING_ACKNOWLEDGE = 71, BSS_MAP_MSG_UNEQUIPPED_CIRCUIT = 72, BSS_MAP_MSG_CHANGE_CIRCUIT = 78, BSS_MAP_MSG_CHANGE_CIRCUIT_ACKNOWLEDGE = 79, /* RADIO RESOURCE MESSAGES */ BSS_MAP_MSG_RESOURCE_RQST = 80, BSS_MAP_MSG_RESOURCE_INDICATION = 81, BSS_MAP_MSG_PAGING = 82, BSS_MAP_MSG_CIPHER_MODE_CMD = 83, BSS_MAP_MSG_CLASSMARK_UPDATE = 84, BSS_MAP_MSG_CIPHER_MODE_COMPLETE = 85, BSS_MAP_MSG_QUEUING_INDICATION = 86, BSS_MAP_MSG_COMPLETE_LAYER_3 = 87, BSS_MAP_MSG_CLASSMARK_RQST = 88, BSS_MAP_MSG_CIPHER_MODE_REJECT = 89, BSS_MAP_MSG_LOAD_INDICATION = 90, /* VGCS/VBS */ BSS_MAP_MSG_VGCS_VBS_SETUP = 4, BSS_MAP_MSG_VGCS_VBS_SETUP_ACK = 5, BSS_MAP_MSG_VGCS_VBS_SETUP_REFUSE = 6, BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_RQST = 7, BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_RESULT = 28, BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_FAILURE = 29, BSS_MAP_MSG_VGCS_VBS_QUEUING_INDICATION = 30, BSS_MAP_MSG_UPLINK_RQST = 31, BSS_MAP_MSG_UPLINK_RQST_ACKNOWLEDGE = 39, BSS_MAP_MSG_VGCS_VBS_ASSIGNMENT_STATUS = 59, BSS_MAP_MSG_VGCS_VBS_AREA_CELL_INFO = 60, BSS_MAP_MSG_UPLINK_RQST_CONFIRMATION = 73, BSS_MAP_MSG_UPLINK_RELEASE_INDICATION = 74, BSS_MAP_MSG_UPLINK_REJECT_CMD = 75, BSS_MAP_MSG_UPLINK_RELEASE_CMD = 76, BSS_MAP_MSG_UPLINK_SEIZED_CMD = 77, BSS_MAP_MSG_VGCS_ADDL_INFO = 0x60, BSS_MAP_MSG_VGCS_SMS = 0x61, BSS_MAP_MSG_NOTIFICATION_DATA = 0x62, BSS_MAP_MSG_UPLINK_APP_DATA = 0x63, /* LOCAL SWITCHING */ BSS_MAP_MSG_LCLS_CONNECT_CTRL = 0x74, BSS_MAP_MSG_LCLS_CONNECT_CTRL_ACK = 0x75, BSS_MAP_MSG_LCLS_NOTIFICATION = 0x76, }; #define BSS_MAP_MSG_ASSIGMENT_RQST BSS_MAP_MSG_ASSIGNMENT_RQST #define BSS_MAP_MSG_ASSIGMENT_COMPLETE BSS_MAP_MSG_ASSIGNMENT_COMPLETE #define BSS_MAP_MSG_ASSIGMENT_FAILURE BSS_MAP_MSG_ASSIGNMENT_FAILURE enum GSM0808_IE_CODING { GSM0808_IE_CIRCUIT_IDENTITY_CODE = 1, GSM0808_IE_RESERVED_0 = 2, GSM0808_IE_RESOURCE_AVAILABLE = 3, GSM0808_IE_CAUSE = 4, GSM0808_IE_CELL_IDENTIFIER = 5, GSM0808_IE_PRIORITY = 6, GSM0808_IE_LAYER_3_HEADER_INFORMATION = 7, GSM0808_IE_IMSI = 8, GSM0808_IE_TMSI = 9, GSM0808_IE_ENCRYPTION_INFORMATION = 10, GSM0808_IE_CHANNEL_TYPE = 11, GSM0808_IE_PERIODICITY = 12, GSM0808_IE_EXTENDED_RESOURCE_INDICATOR = 13, GSM0808_IE_NUMBER_OF_MSS = 14, GSM0808_IE_RESERVED_1 = 15, GSM0808_IE_RESERVED_2 = 16, GSM0808_IE_RESERVED_3 = 17, GSM0808_IE_CLASSMARK_INFORMATION_T2 = 18, GSM0808_IE_CLASSMARK_INFORMATION_T3 = 19, GSM0808_IE_INTERFERENCE_BAND_TO_USE = 20, GSM0808_IE_RR_CAUSE = 21, GSM0808_IE_RESERVED_4 = 22, GSM0808_IE_LAYER_3_INFORMATION = 23, GSM0808_IE_DLCI = 24, GSM0808_IE_DOWNLINK_DTX_FLAG = 25, GSM0808_IE_CELL_IDENTIFIER_LIST = 26, GSM0808_IE_RESPONSE_RQST = 27, GSM0808_IE_RESOURCE_INDICATION_METHOD = 28, GSM0808_IE_CLASSMARK_INFORMATION_TYPE_1 = 29, GSM0808_IE_CIRCUIT_IDENTITY_CODE_LIST = 30, GSM0808_IE_DIAGNOSTIC = 31, GSM0808_IE_LAYER_3_MESSAGE_CONTENTS = 32, GSM0808_IE_CHOSEN_CHANNEL = 33, GSM0808_IE_TOTAL_RESOURCE_ACCESSIBLE = 34, GSM0808_IE_CIPHER_RESPONSE_MODE = 35, GSM0808_IE_CHANNEL_NEEDED = 36, GSM0808_IE_TRACE_TYPE = 37, GSM0808_IE_TRIGGERID = 38, GSM0808_IE_TRACE_REFERENCE = 39, GSM0808_IE_TRANSACTIONID = 40, GSM0808_IE_MOBILE_IDENTITY = 41, GSM0808_IE_OMCID = 42, GSM0808_IE_FORWARD_INDICATOR = 43, GSM0808_IE_CHOSEN_ENCR_ALG = 44, GSM0808_IE_CIRCUIT_POOL = 45, GSM0808_IE_CIRCUIT_POOL_LIST = 46, GSM0808_IE_TIME_INDICATION = 47, GSM0808_IE_RESOURCE_SITUATION = 48, GSM0808_IE_CURRENT_CHANNEL_TYPE_1 = 49, GSM0808_IE_QUEUEING_INDICATOR = 50, GSM0808_IE_SPEECH_VERSION = 64, GSM0808_IE_ASSIGNMENT_REQUIREMENT = 51, GSM0808_IE_TALKER_FLAG = 53, GSM0808_IE_CONNECTION_RELEASE_RQSTED = 54, GSM0808_IE_GROUP_CALL_REFERENCE = 55, GSM0808_IE_EMLPP_PRIORITY = 56, GSM0808_IE_CONFIG_EVO_INDI = 57, GSM0808_IE_OLD_BSS_TO_NEW_BSS_INFORMATION = 58, GSM0808_IE_LSA_IDENTIFIER = 59, GSM0808_IE_LSA_IDENTIFIER_LIST = 60, GSM0808_IE_LSA_INFORMATION = 61, GSM0808_IE_LCS_QOS = 62, GSM0808_IE_LSA_ACCESS_CTRL_SUPPR = 63, GSM0808_IE_LCS_PRIORITY = 67, GSM0808_IE_LOCATION_TYPE = 68, GSM0808_IE_LOCATION_ESTIMATE = 69, GSM0808_IE_POSITIONING_DATA = 70, GSM0808_IE_LCS_CAUSE = 71, GSM0808_IE_LCS_CLIENT_TYPE = 72, GSM0808_IE_APDU = 73, GSM0808_IE_NETWORK_ELEMENT_IDENTITY = 74, GSM0808_IE_GPS_ASSISTANCE_DATA = 75, GSM0808_IE_DECIPHERING_KEYS = 76, GSM0808_IE_RETURN_ERROR_RQST = 77, GSM0808_IE_RETURN_ERROR_CAUSE = 78, GSM0808_IE_SEGMENTATION = 79, GSM0808_IE_SERVICE_HANDOVER = 80, GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_UMTS = 81, GSM0808_IE_SOURCE_RNC_TO_TARGET_RNC_TRANSPARENT_CDMA2000 = 82, GSM0808_IE_RESERVED_5 = 65, GSM0808_IE_RESERVED_6 = 66, GSM0808_IE_GERAN_CLASSMARK = 0x53, GSM0808_IE_GERAN_BSC_CONTAINER = 0x54, GSM0808_IE_NEW_BSS_TO_OLD_BSS_INFO = 0x61, GSM0800_IE_INTER_SYSTEM_INFO = 0x63, GSM0808_IE_SNA_ACCESS_INFO = 0x64, GSM0808_IE_VSTK_RAND_INFO = 0x65, GSM0808_IE_VSTK_INFO = 0x66, GSM0808_IE_PAGING_INFO = 0x67, GSM0808_IE_IMEI = 0x68, GSM0808_IE_VELOCITY_ESTIMATE = 0x55, GSM0808_IE_VGCS_FEATURE_FLAGS = 0x69, GSM0808_IE_TALKER_PRIORITY = 0x6a, GSM0808_IE_EMERGENCY_SET_INDICATION = 0x6b, GSM0808_IE_TALKER_IDENTITY = 0x6c, GSM0808_IE_CELL_ID_LIST_SEGMENT = 0x6d, GSM0808_IE_SMS_TO_VGCS = 0x6e, GSM0808_IE_VGCS_TALKER_MODE = 0x6f, GSM0808_IE_VGCS_VBS_CELL_STATUS = 0x70, GSM0808_IE_CELL_ID_LIST_SEG_EST_CELLS = 0x71, GSM0808_IE_CELL_ID_LIST_SEG_CELLS_TBE = 0x72, GSM0808_IE_CELL_ID_LIST_SEG_REL_CELLS = 0x73, GSM0808_IE_CELL_ID_LIST_SEG_NE_CELLS = 0x74, GSM0808_IE_GANSS_ASSISTANCE_DATA = 0x75, GSM0808_IE_GANSS_POSITIONING_DATA = 0x76, GSM0808_IE_GANSS_LOCATION_TYPE = 0x77, GSM0808_IE_APP_DATA = 0x78, GSM0808_IE_DATA_IDENTITY = 0x79, GSM0808_IE_APP_DATA_INFO = 0x7a, GSM0808_IE_MSISDN = 0x7b, GSM0808_IE_AOIP_TRASP_ADDR = 0x7c, GSM0808_IE_SPEECH_CODEC_LIST = 0x7d, GSM0808_IE_SPEECH_CODEC = 0x7e, GSM0808_IE_CALL_ID = 0x7f, GSM0808_IE_CALL_ID_LIST = 0x80, GSM0808_IE_A_IF_SEL_FOR_RESET = 0x81, GSM0808_IE_KC_128 = 0x83, GSM0808_IE_CSG_IDENTIFIER = 0x84, GSM0808_IE_REDIR_ATTEMPT_FLAG = 0x85, GSM0808_IE_REROUTE_REJ_CAUSE = 0x86, GSM0808_IE_SEND_SEQ_NUM = 0x87, GSM0808_IE_REROUTE_COMPL_OUTCOME = 0x88, GSM0808_IE_GLOBAL_CALL_REF = 0x89, GSM0808_IE_LCLS_CONFIG = 0x8a, GSM0808_IE_LCLS_CONN_STATUS_CTRL = 0x8b, GSM0808_IE_LCLS_CORR_NOT_NEEDED = 0x8c, GSM0808_IE_LCLS_BSS_STATUS = 0x8d, GSM0808_IE_LCLS_BREAK_REQ = 0x8e, GSM0808_IE_CSFB_INDICATION = 0x8f, GSM0808_IE_CS_TO_PS_SRVCC = 0x90, GSM0808_IE_SRC_ENB_TO_TGT_ENB_TRANSP = 0x91, GSM0808_IE_CS_TO_PS_SRVCC_IND = 0x92, GSM0808_IE_CN_TO_MS_TRANSP_INFO = 0x93, GSM0808_IE_SELECTED_PLMN_ID = 0x94, GSM0808_IE_LAST_USED_EUTRAN_PLMN_ID = 0x95, GSM0808_IE_OLD_LAI = 0x96, GSM0808_IE_ATTACH_INDICATOR = 0x97, GSM0808_IE_SELECTED_OPERATOR = 0x98, GSM0808_IE_PS_REGISTERED_OPERATOR = 0x99, GSM0808_IE_CS_REGISTERED_OPERATOR = 0x9a, /* Osmocom and Themyscira extensions: */ GSM0808_IE_OSMO_OSMUX_SUPPORT = 0xf0, GSM0808_IE_OSMO_OSMUX_CID = 0xf1, GSM0808_IE_THEMWI_RTP_EXTENSIONS = 0xf2, }; /* 3GPP TS 48.008 3.2.3 Signalling Field Element Coding. See also extra fields in 3.2.2.58 and 3.2.2.80 */ enum GSM0808_SIGNALLING_FIELD_ELEMENT_CODING { GSM0808_FE_IE_EXTRA_INFORMATION = 0x01, /*< 3.2.3.1 */ GSM0808_FE_IE_CURRENT_CHANNEL_TYPE_2 = 0x02, /*< 3.2.3.2 */ GSM0808_FE_IE_TARGET_CELL_RADIO_INFORMATION = 0x03, /*< 3.2.3.3 */ GSM0808_FE_IE_GPRS_SUSPEND_INFORMATION = 0x04, /*< 3.2.3.4 */ GSM0808_FE_IE_MULTIRATE_CONFIGURATION_INFORMATION = 0x05, /*< 3.2.3.5 */ GSM0808_FE_IE_DUAL_TRANSFER_MODE_INFORMATION = 0x06, /*< 3.2.3.6 */ GSM0808_FE_IE_INTER_RAT_HANDOVER_INFO = 0x07, /*< 3.2.3.7 */ GSM0808_FE_IE_CDMA2000_CAPABILITY_INFORMATION = 0x08, /*< 3.2.3.8 */ GSM0808_FE_IE_DOWNLINK_CELL_LOAD_INFORMATION = 0x09, /*< 3.2.3.9 */ GSM0808_FE_IE_UPLINK_CELL_LOAD_INFORMATION = 0x0a, /*< 3.2.3.10 */ GSM0808_FE_IE_CELL_LOAD_INFORMATION_GROUP = 0x0b, /*< 3.2.3.11 */ GSM0808_FE_IE_CELL_LOAD_INFORMATION = 0x0c, /*< 3.2.3.12 */ GSM0808_FE_IE_PS_INDICATION = 0x0d, /*< 3.2.3.13 */ GSM0808_FE_IE_DTM_HANDOVER_COMMAND_INDICATION = 0x0e, /*< 3.2.3.14 */ GSM0808_FE_IE_D_RNTI = 0xfe, /*< 3.2.3.15 */ GSM0808_FE_IE_IRAT_MEASUREMENT_CONFIGURATION = 0x0f, /*< 3.2.3.16 */ GSM0808_FE_IE_SOURCE_CELL_ID = 0x10, /*< 3.2.3.17 */ GSM0808_FE_IE_IRAT_MEASUREMENT_CONFIGURATION_EXTENDED_E_ARFCNS = 0x11, /*< 3.2.3.18 */ GSM0808_FE_IE_VGCS_TALKER_MODE = 0x6f, /*< 3.2.2.93 */ GSM0808_FE_IE_LAST_USED_EUTRAN_PLMN_ID = 0x95, /*< 3.2.2.127 */ }; /* 3GPP TS 48.008 3.2.2.5 Cause */ enum gsm0808_cause { GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE = 0, GSM0808_CAUSE_RADIO_INTERFACE_FAILURE = 1, GSM0808_CAUSE_UPLINK_QUALITY = 2, GSM0808_CAUSE_UPLINK_STRENGTH = 3, GSM0808_CAUSE_DOWNLINK_QUALITY = 4, GSM0808_CAUSE_DOWNLINK_STRENGTH = 5, GSM0808_CAUSE_DISTANCE = 6, GSM0808_CAUSE_O_AND_M_INTERVENTION = 7, GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION = 8, GSM0808_CAUSE_CALL_CONTROL = 9, GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION = 10, GSM0808_CAUSE_HANDOVER_SUCCESSFUL = 11, GSM0808_CAUSE_BETTER_CELL = 12, GSM0808_CAUSE_DIRECTED_RETRY = 13, GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL = 14, GSM0808_CAUSE_TRAFFIC = 15, GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL = 0x10, GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL = 0x11, GSM0808_CAUSE_RELOCATION_TRIGGERED = 0x12, GSM0808_CAUSE_REQUESTED_OPT_NOT_AUTHORISED = 0x14, GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED = 0x15, GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG = 0x16, GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT = 0x17, GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE = 0x18, GSM0808_CAUSE_EQUIPMENT_FAILURE = 32, GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE = 33, GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE = 34, GSM0808_CAUSE_CCCH_OVERLOAD = 35, GSM0808_CAUSE_PROCESSOR_OVERLOAD = 36, GSM0808_CAUSE_BSS_NOT_EQUIPPED = 37, GSM0808_CAUSE_MS_NOT_EQUIPPED = 38, GSM0808_CAUSE_INVALID_CELL = 39, GSM0808_CAUSE_TRAFFIC_LOAD = 40, GSM0808_CAUSE_PREEMPTION = 41, GSM0808_CAUSE_DTM_HO_SGSN_FAILURE = 0x2a, GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE = 0x2b, GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE = 48, GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH = 49, GSM0808_CAUSE_SWITCH_CIRCUIT_POOL = 50, GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE = 51, GSM0808_CAUSE_LSA_NOT_ALLOWED = 52, GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL = 0x35, GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL = 0x36, GSM0808_CAUSE_INVALID_CSG_CELL = 0x37, GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL = 0x3f, GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED = 64, GSM0808_CAUSE_GERAN_IU_MODE_FAILURE = 0x41, GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE = 0x42, GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS = 0x43, GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP = 0x44, GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP = 0x45, GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP = 0x46, GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED = 80, GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS = 81, GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING = 82, GSM0808_CAUSE_INCORRECT_VALUE = 83, GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE = 84, GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT = 85, GSM0808_CAUSE_DTM_HO_INVALID_PS_IND = 0x56, GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC = 0x57, GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC = 96, GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTENT = 0x61, GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY = 0x62, }; /* 3GPP TS 08.08 §3.2.2.5 Cause Class */ enum gsm0808_cause_class { GSM0808_CAUSE_CLASS_NORM0 = 0, GSM0808_CAUSE_CLASS_NORM1 = 1, GSM0808_CAUSE_CLASS_RES_UNAVAIL = 2, GSM0808_CAUSE_CLASS_SRV_OPT_NA = 3, GSM0808_CAUSE_CLASS_SRV_OPT_NIMPL = 4, GSM0808_CAUSE_CLASS_INVAL = 5, GSM0808_CAUSE_CLASS_PERR = 6, GSM0808_CAUSE_CLASS_INTW = 7, }; /* GSM 08.08 3.2.2.11 Channel Type */ enum gsm0808_chan_indicator { GSM0808_CHAN_SPEECH = 1, GSM0808_CHAN_DATA = 2, GSM0808_CHAN_SIGN = 3, GSM0808_CHAN_SPEECH_CTM_TEXT_TELEPHONY = 4, }; /* GSM 08.08 3.2.2.11 Channel Type */ #define GSM0808_DATA_FULL_RPREF GSM0808_DATA_FULL_PREF enum gsm0808_chan_rate_type_data { GSM0808_DATA_FULL_BM = 0x8, GSM0808_DATA_HALF_LM = 0x9, GSM0808_DATA_FULL_PREF = 0xa, GSM0808_DATA_HALF_PREF = 0xb, GSM0808_DATA_FULL_PREF_NO_CHANGE = 0x1a, GSM0808_DATA_HALF_PREF_NO_CHANGE = 0x1b, GSM0808_DATA_MULTI_MASK = 0x20, GSM0808_DATA_MULTI_MASK_NO_CHANGE = 0x30, }; /* GSM 08.08 3.2.2.11 Channel Type */ enum gsm0808_chan_rate_type_speech { GSM0808_SPEECH_FULL_BM = 0x8, GSM0808_SPEECH_HALF_LM = 0x9, GSM0808_SPEECH_FULL_PREF= 0xa, GSM0808_SPEECH_HALF_PREF= 0xb, GSM0808_SPEECH_FULL_PREF_NO_CHANGE = 0x1a, GSM0808_SPEECH_HALF_PREF_NO_CHANGE = 0x1b, GSM0808_SPEECH_PERM = 0xf, GSM0808_SPEECH_PERM_NO_CHANGE = 0x1f, }; /* GSM 08.08 3.2.2.11 Channel Type */ enum gsm0808_chan_rate_type_sign { GSM0808_SIGN_ANY = 0x00, GSM0808_SIGN_SDCCH = 0x01, GSM0808_SIGN_SDCCH_FULL_BM = 0x02, GSM0808_SIGN_SDCCH_HALF_LM = 0x03, GSM0808_SIGN_FULL_BM = 0x08, GSM0808_SIGN_HALF_LM = 0x09, GSM0808_SIGN_FULL_PREF = 0x0a, GSM0808_SIGN_HALF_PREF = 0x0b, GSM0808_SIGN_FULL_PREF_NO_CHANGE = 0x1a, GSM0808_SIGN_HALF_PREF_NO_CHANGE = 0x1b, }; /*! GSM 08.08 3.2.2.11 Channel Type * (see also 3GPP TS 48.008, section 3.2.2.11) */ enum gsm0808_permitted_speech { GSM0808_PERM_FR1 = 0x01, /*!< GSM FR */ GSM0808_PERM_FR2 = 0x11, /*!< GSM EFR */ GSM0808_PERM_FR3 = 0x21, /*!< FR AMR */ GSM0808_PERM_FR4 = 0x41, /*!< OFR AMR-WB */ GSM0808_PERM_FR5 = 0x42, /*!< FR AMR-WB */ GSM0808_PERM_HR1 = GSM0808_PERM_FR1 | 0x4, /*!< GSM HR */ GSM0808_PERM_HR2 = GSM0808_PERM_FR2 | 0x4, /*!< (deprecated) */ GSM0808_PERM_HR3 = GSM0808_PERM_FR3 | 0x4, /*!< HR AMR */ GSM0808_PERM_HR4 = 0x46, /*!< OHR AMR-WB */ GSM0808_PERM_HR6 = 0x45, /*!< OHR AMR */ }; /* 3GPP TS 48.008 3.2.2.11 Channel Type * Transparent: Data Rate */ enum gsm0808_data_rate_transp { GSM0808_DATA_RATE_TRANSP_32k0 = 0x3a, GSM0808_DATA_RATE_TRANSP_28k8 = 0x39, GSM0808_DATA_RATE_TRANSP_14k4 = 0x18, GSM0808_DATA_RATE_TRANSP_9k6 = 0x10, GSM0808_DATA_RATE_TRANSP_4k8 = 0x11, GSM0808_DATA_RATE_TRANSP_2k4 = 0x12, GSM0808_DATA_RATE_TRANSP_1k2 = 0x13, GSM0808_DATA_RATE_TRANSP_600 = 0x14, GSM0808_DATA_RATE_TRANSP_1200_75 = 0x15, }; /* 3GPP TS 48.008 3.2.2.11 Channel Type * Non-Transparent: Radio Interface Data Rate (preferred) */ enum gsm0808_data_rate_non_transp { GSM0808_DATA_RATE_NON_TRANSP_12000_6000 = 0x00, GSM0808_DATA_RATE_NON_TRANSP_43k5 = 0x34, GSM0808_DATA_RATE_NON_TRANSP_29k0 = 0x31, GSM0808_DATA_RATE_NON_TRANSP_14k5 = 0x14, GSM0808_DATA_RATE_NON_TRANSP_12k0 = 0x10, GSM0808_DATA_RATE_NON_TRANSP_6k0 = 0x11, }; /* 3GPP TS 48.008 3.2.2.11 Channel Type * Non-Transparent: Allowed Radio Interface Data Rate (all possible allowed) */ enum gsm0808_data_rate_allowed_r_if { GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_43k5 = 0x40, GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_32k0 = 0x20, GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_29k0 = 0x10, GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_14k5 = 0x08, GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_12k0 = 0x02, GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_6k0 = 0x01, }; extern const struct value_string gsm0808_permitted_speech_names[]; static inline const char *gsm0808_permitted_speech_name(enum gsm0808_permitted_speech val) { return get_value_string(gsm0808_permitted_speech_names, val); } /*! 3GPP TS 48.008, 3.2.2.103 Speech Codec Type */ enum gsm0808_speech_codec_type { GSM0808_SCT_FR1 = 0x0, /*!< GSM FR */ GSM0808_SCT_FR2 = 0x2, /*!< GSM EFR */ GSM0808_SCT_FR3 = 0x3, /*!< FR AMR */ GSM0808_SCT_FR4 = 0xc, /*!< OFR AMR-WB */ GSM0808_SCT_FR5 = 0x9, /*!< FR AMR-WB */ GSM0808_SCT_HR1 = 0x1, /*!< GSM_HR */ GSM0808_SCT_HR3 = 0x4, /*!< HR_AMR */ GSM0808_SCT_HR4 = 0xd, /*!< OHR AMR-WB */ GSM0808_SCT_HR6 = 0xb, /*!< OHR AMR */ GSM0808_SCT_CSD = 0xfd, /*!< CSData (see also TS 26.103) */ }; /* Codec Extension (the real Codec Type follows in the next octet). * This value is intentionally not included in gsm0808_speech_codec_type, * because {enc,dec}_speech_codec() functions take care of the extended * encoding internally. It shall not be used in struct gsm0808_speech_codec. */ #define GSM0808_SCT_EXT 0x0f extern const struct value_string gsm0808_speech_codec_type_names[]; static inline const char *gsm0808_speech_codec_type_name(enum gsm0808_speech_codec_type val) { return get_value_string(gsm0808_speech_codec_type_names, val); } /* GSM 08.08 3.2.2.44 Chosen Encryption Algorithm */ enum gsm0808_chosen_enc_alg { GSM0808_ALG_ID_A5_0 = 0x01, GSM0808_ALG_ID_A5_1 = 0x02, GSM0808_ALG_ID_A5_2 = 0x03, GSM0808_ALG_ID_A5_3 = 0x04, GSM0808_ALG_ID_A5_4 = 0x05, GSM0808_ALG_ID_A5_5 = 0x06, GSM0808_ALG_ID_A5_6 = 0x07, GSM0808_ALG_ID_A5_7 = 0x08, }; extern const struct value_string gsm0808_chosen_enc_alg_names[]; /* GSM 08.08 3.2.2.85 Paging Information */ enum gsm0808_paging_info { GSM0808_PAGINF_FOR_MT_CALL = 0x00, GSM0808_PAGINF_FOR_SMS = 0x01, GSM0808_PAGINF_FOR_USSD = 0x02, }; /*! 3GPP TS 48.008 3.2.2.104 Speech Codec. * Valid if (fi || pi || pt) == true, otherwise ignore. */ struct gsm0808_speech_codec { /*! Full IP: AoIP with compressed speech via RTP/UDP/IP. */ bool fi; /*! PCMoIP: PCM over A-Interface via RTP/UPD/IP. */ bool pi; /*! PCMoTDM: PCM over A-Interface with TDM as transport. */ bool pt; /*! TFO (Inband Tandem Free Operation). Only valid if (pi || pt) == true. */ bool tf; /*! See enum gsm0808_speech_codec_type. */ uint8_t type; /*! For examples, see enum gsm0808_speech_codec_defaults. */ uint16_t cfg; }; /*! Default speech codec configurations: Some codecs specified with * struct gsm0808_speech_codec, require a configuration (cfg). The following * default configuration will configure the codec (RTP) to match the * configuration that is used on the air interface (Um). * * Default values for FR_AMR, HR_AMR and OHR_AMR: * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for * the Adaptive Multi-Rate Codec Types and 3GPP TS 48.008, Section 3.2.2.103. * * Default values for FR_AMR_WB, OFR_AMR_WB and OHR_AMR_WB: * See also: 3GPP TS 26.103, Table 5.7-1: Allowed Configurations * for the Adaptive Multi-Rate - Wideband Codec Types * * This is a copy of 3GPP TS 28.062, Table 7.11.3.1.3-2: * * S0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 * 12,20 (x) x x x * 10,20 x x x * 7,95 x x x * 7,40 x x x x * 6,70 x x x x x x * 5,90 x x x x x x x x x x * 5,15 * 4,75 x x x x x x x x x x * * OM F F F F F F F F F F F A F A F A * * HR Y Y Y Y Y Y Y Y Y * FR Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y * * Each bit allows one Codec Configuration. * 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 * "F" forbidden to change in Optimisation Mode, "Y" HR AMR supports this mode, and "Y" FR AMR can also do it. * * This means that whichever configuration is chosen from S0 thru S15, there are never more than four rates active. * * The spec praises S1 as the most desired configuration: "because it leads in all call cases to TFO/TrFO compatible * connections with optimal voice quality." (Since HR AMR supports up to 7.95k, it seems that S14 would be more optimal * voice quality, but it is not marked as supported by HR AMR.) * * For FR_AMR below, the default of 0x57ff means: * 0x57ff = 0101 0111 1111 1111 * ^14 ^10 ^0 * allow config 0 thru 10, and configs 12 and 14. * * For HR_AMR, drop all those where there is no "Y" in the HR row: * 0x073f = 0000 0111 0011 1111 * ^15 ^11 ^6 ^0 */ enum gsm0808_speech_codec_defaults { GSM0808_SC_CFG_DEFAULT_FR_AMR = 0x57ff, GSM0808_SC_CFG_DEFAULT_HR_AMR = 0x073f, GSM0808_SC_CFG_DEFAULT_OHR_AMR = 0x57ff, GSM0808_SC_CFG_DEFAULT_FR_AMR_WB = 0x01, GSM0808_SC_CFG_DEFAULT_OFR_AMR_WB = 0x15, GSM0808_SC_CFG_DEFAULT_OHR_AMR_WB = 0x01, }; /*! Default speech codec configurations broken down by rate. * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for * the Adaptive Multi-Rate Codec Types. * * Set all Sn bits that have this rate listed as active. */ enum gsm0808_speech_codec_rate_defaults { GSM0808_SC_CFG_DEFAULT_AMR_4_75 = 0xff03, GSM0808_SC_CFG_DEFAULT_AMR_5_15 = 0x0000, GSM0808_SC_CFG_DEFAULT_AMR_5_90 = 0xff06, GSM0808_SC_CFG_DEFAULT_AMR_6_70 = 0x3e08, GSM0808_SC_CFG_DEFAULT_AMR_7_40 = 0x0c12, GSM0808_SC_CFG_DEFAULT_AMR_7_95 = 0xc020, GSM0808_SC_CFG_DEFAULT_AMR_10_2 = 0x3040, GSM0808_SC_CFG_DEFAULT_AMR_12_2 = 0xc082 }; /*! Single speech codec configurations broken down by rate. * See also: 3GPP TS 28.062, Table 7.11.3.1.3-2: Preferred Configurations for * the Adaptive Multi-Rate Codec Types. * * Set bit Sn (S0 = 0x01), where Sn is identified by a descriptive name. */ enum gsm0808_speech_codec_rate { GSM0808_SC_CFG_AMR_4_75 = 0x0001, GSM0808_SC_CFG_AMR_4_75_5_90_7_40_12_20 = 0x0002, GSM0808_SC_CFG_AMR_5_90 = 0x0004, GSM0808_SC_CFG_AMR_6_70 = 0x0008, GSM0808_SC_CFG_AMR_7_40 = 0x0010, GSM0808_SC_CFG_AMR_7_95 = 0x0020, GSM0808_SC_CFG_AMR_10_2 = 0x0040, GSM0808_SC_CFG_AMR_12_2 = 0x0080, }; /* Bit index of a mode as returned by gsm0808_amr_modes_from_cfg[]. * Example: * if (gsm0808_amr_modes_from_cfg[full_rate ? 1 : 0][9] & GSM0808_AMR_MODE_4_75) * printf("S9 supports 4k75"); */ enum gsm0808_amr_mode { GSM0808_AMR_MODE_4_75 = 0, GSM0808_AMR_MODE_5_15, GSM0808_AMR_MODE_5_90, GSM0808_AMR_MODE_6_70, GSM0808_AMR_MODE_7_40, GSM0808_AMR_MODE_7_95, GSM0808_AMR_MODE_10_2, GSM0808_AMR_MODE_12_2, }; extern const struct value_string gsm0808_amr_mode_names[]; static inline const char *gsm0808_amr_mode_name(enum gsm0808_amr_mode val) { return get_value_string(gsm0808_amr_mode_names, val); } extern const uint8_t gsm0808_amr_modes_from_cfg[2][16]; /* 3GPP TS 48.008 3.2.2.103 Speech Codec List */ #define SPEECH_CODEC_MAXLEN 255 struct gsm0808_speech_codec_list { struct gsm0808_speech_codec codec[SPEECH_CODEC_MAXLEN]; uint8_t len; }; /* 3GPP TS 48.008 3.2.2.11 Channel Type * Asymmetry Preference (used for data, non-transparent service) */ enum gsm0808_channel_type_asym_pref { GSM0808_CT_ASYM_PREF_NOT_APPLICABLE = 0, GSM0808_CT_ASYM_PREF_UL = 1, GSM0808_CT_ASYM_PREF_DL = 2, GSM0808_CT_ASYM_PREF_SPARE = 3, }; /* 3GPP TS 48.008 3.2.2.11 Channel Type */ #define CH_TYPE_PERM_SPCH_MAXLEN 9 struct gsm0808_channel_type { uint8_t ch_indctr; uint8_t ch_rate_type; /* Speech only */ uint8_t perm_spch[CH_TYPE_PERM_SPCH_MAXLEN]; unsigned int perm_spch_len; /* Data only */ bool data_transparent; uint8_t data_rate; bool data_rate_allowed_is_set; uint8_t data_rate_allowed; bool data_asym_pref_is_set; enum gsm0808_channel_type_asym_pref data_asym_pref; }; /* 3GPP TS 48.008 3.2.2.10 Encryption Information */ #define ENCRY_INFO_KEY_MAXLEN 252 #define ENCRY_INFO_PERM_ALGO_MAXLEN 8 struct gsm0808_encrypt_info { uint8_t perm_algo[ENCRY_INFO_PERM_ALGO_MAXLEN]; unsigned int perm_algo_len; uint8_t key[ENCRY_INFO_KEY_MAXLEN]; unsigned int key_len; }; #define CELL_ID_LIST_LAC_MAXLEN 127 /*! * DEPRECATED: This definition of the cell identifier list is * insufficient. It cannot support all types of cell identifiers. * Use struct gsm0808_cell_id_list2 in gsm0808_utils.h instead. * * 3GPP TS 48.008 3.2.2.27 Cell Identifier List */ struct gsm0808_cell_id_list { uint8_t id_discr; uint16_t id_list_lac[CELL_ID_LIST_LAC_MAXLEN]; unsigned int id_list_len; }; /* TS 48.008 3.2.2.116 */ enum gsm0808_lcls_config { GSM0808_LCLS_CFG_BOTH_WAY = 0x00, GSM0808_LCLS_CFG_BOTH_WAY_AND_BICAST_UL = 0x01, GSM0808_LCLS_CFG_BOTH_WAY_AND_SEND_DL = 0x02, GSM0808_LCLS_CFG_BOTH_WAY_AND_SEND_DL_BLOCK_LOCAL_DL = 0x03, GSM0808_LCLS_CFG_BOTH_WAY_AND_BICAST_UL_SEND_DL = 0x04, GSM0808_LCLS_CFG_BOTH_WAY_AND_BICAST_UL_SEND_DL_BLOCK_LOCAL_DL = 0x05, GSM0808_LCLS_CFG_NA = 0xFF }; /* TS 48.008 3.2.2.117 */ enum gsm0808_lcls_control { GSM0808_LCLS_CSC_CONNECT = 0x00, GSM0808_LCLS_CSC_DO_NOT_CONNECT = 0x01, GSM0808_LCLS_CSC_RELEASE_LCLS = 0x02, GSM0808_LCLS_CSC_BICAST_UL_AT_HANDOVER = 0x03, GSM0808_LCLS_CSC_BICAST_UL_AND_RECV_DL_AT_HANDOVER = 0x04, GSM0808_LCLS_CSC_NA = 0xFF }; /* TS 48.008 3.2.2.119 */ enum gsm0808_lcls_status { GSM0808_LCLS_STS_NOT_YET_LS = 0x00, GSM0808_LCLS_STS_NOT_POSSIBLE_LS = 0x01, GSM0808_LCLS_STS_NO_LONGER_LS = 0x02, GSM0808_LCLS_STS_REQ_LCLS_NOT_SUPP = 0x03, GSM0808_LCLS_STS_LOCALLY_SWITCHED = 0x04, GSM0808_LCLS_STS_NA = 0xFF }; /* 3GPP TS 48.008 3.2.2.32 Diagnostics */ struct gsm0808_diagnostics { uint8_t error_pointer_octet; #if OSMO_IS_LITTLE_ENDIAN uint8_t error_pointer_bit_spare:4, error_pointer_bit:4; #elif OSMO_IS_BIG_ENDIAN /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ uint8_t error_pointer_bit:4, error_pointer_bit_spare:4; #endif uint8_t msg[0]; /*! received message which provoked the error */ } __attribute__((packed));