Harald Welte | 381a1aa | 2017-10-16 18:31:20 +0200 | [diff] [blame] | 1 | /*! \defgroup gsup Generic Subscriber Update Protocol |
| 2 | * @{ |
| 3 | * |
| 4 | * The Generic Subscriber Update Protocol (GSUP) is an Osmocom-specific |
| 5 | * non-standard protocol replacing MAP as the protocol between |
| 6 | * MSC/VLR/SGSN and HLR in a 3GPP cellular communications network. |
| 7 | * |
| 8 | * It was designed around the same transactions and architecture as the |
| 9 | * MAP messages/operations, but without the complexity of TCAP and MAP, |
| 10 | * and without the need for ASN.1 encoding. |
| 11 | * |
| 12 | * The purpose is to keep protocol complexity out of OsmoSGSN and |
| 13 | * OsmoMSC, while providing a clean path to an external GSUP to MAP |
| 14 | * translator. |
| 15 | * |
| 16 | * \file gsup.h |
| 17 | * Osmocom Generic Subscriber Update Protocol message encoder/decoder. */ |
Neels Hofmeyr | 17518fe | 2017-06-20 04:35:06 +0200 | [diff] [blame] | 18 | /* |
Harald Welte | e08da97 | 2017-11-13 01:00:26 +0900 | [diff] [blame] | 19 | * (C) 2014 by sysmocom - s.f.m.c. GmbH, Author: Jacob Erlbeck |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 20 | * (C) 2016 by Harald Welte <laforge@gnumonks.org> |
| 21 | * All Rights Reserved |
| 22 | * |
Harald Welte | e08da97 | 2017-11-13 01:00:26 +0900 | [diff] [blame] | 23 | * SPDX-License-Identifier: GPL-2.0+ |
| 24 | * |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 25 | * This program is free software; you can redistribute it and/or modify |
| 26 | * it under the terms of the GNU General Public License as published by |
| 27 | * the Free Software Foundation; either version 2 of the License, or |
| 28 | * (at your option) any later version. |
| 29 | * |
| 30 | * This program is distributed in the hope that it will be useful, |
| 31 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 32 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 33 | * GNU General Public License for more details. |
| 34 | * |
| 35 | * You should have received a copy of the GNU General Public License |
| 36 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 37 | * |
| 38 | */ |
| 39 | #pragma once |
| 40 | |
| 41 | #include <stdint.h> |
| 42 | #include <osmocom/core/msgb.h> |
Vadim Yanitskiy | c262831 | 2018-09-25 23:03:13 +0700 | [diff] [blame] | 43 | #include <osmocom/gsm/gsup_sms.h> |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 44 | #include <osmocom/gsm/protocol/gsm_23_003.h> |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 45 | #include <osmocom/gsm/protocol/gsm_03_40.h> |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 46 | #include <osmocom/gsm/protocol/gsm_04_08_gprs.h> |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 47 | #include <osmocom/gsm/protocol/gsm_08_08.h> |
Neels Hofmeyr | 1b729ce | 2018-12-26 18:13:38 +0100 | [diff] [blame] | 48 | #include <osmocom/gsm/gsm_utils.h> |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 49 | #include <osmocom/crypt/auth.h> |
| 50 | |
Neels Hofmeyr | b970e10 | 2017-07-21 15:55:28 +0200 | [diff] [blame] | 51 | #define OSMO_GSUP_PORT 4222 |
| 52 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 53 | /*! Maximum nubmer of PDP inside \ref osmo_gsup_message */ |
| 54 | #define OSMO_GSUP_MAX_NUM_PDP_INFO 10 /* GSM 09.02 limits this to 50 */ |
| 55 | /*! Maximum number of auth info inside \ref osmo_gsup_message */ |
| 56 | #define OSMO_GSUP_MAX_NUM_AUTH_INFO 5 |
| 57 | /*! Maximum number of octets encoding MSISDN in BCD format */ |
| 58 | #define OSMO_GSUP_MAX_MSISDN_LEN 9 |
Stefan Sperling | dda1d45 | 2018-05-03 11:50:32 +0200 | [diff] [blame] | 59 | #define OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN 43 /* TS 24.008 10.5.4.7 */ |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 60 | |
| 61 | #define OSMO_GSUP_PDP_TYPE_SIZE 2 |
| 62 | |
| 63 | /*! Information Element Identifiers for GSUP IEs */ |
| 64 | enum osmo_gsup_iei { |
| 65 | OSMO_GSUP_IMSI_IE = 0x01, |
| 66 | OSMO_GSUP_CAUSE_IE = 0x02, |
| 67 | OSMO_GSUP_AUTH_TUPLE_IE = 0x03, |
| 68 | OSMO_GSUP_PDP_INFO_COMPL_IE = 0x04, |
| 69 | OSMO_GSUP_PDP_INFO_IE = 0x05, |
| 70 | OSMO_GSUP_CANCEL_TYPE_IE = 0x06, |
| 71 | OSMO_GSUP_FREEZE_PTMSI_IE = 0x07, |
| 72 | OSMO_GSUP_MSISDN_IE = 0x08, |
| 73 | OSMO_GSUP_HLR_NUMBER_IE = 0x09, |
Neels Hofmeyr | 9838c90 | 2019-04-01 22:24:33 +0200 | [diff] [blame] | 74 | OSMO_GSUP_MESSAGE_CLASS_IE = 0x0a, |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 75 | OSMO_GSUP_PDP_CONTEXT_ID_IE = 0x10, |
| 76 | OSMO_GSUP_PDP_TYPE_IE = 0x11, |
| 77 | OSMO_GSUP_ACCESS_POINT_NAME_IE = 0x12, |
| 78 | OSMO_GSUP_PDP_QOS_IE = 0x13, |
Holger Hans Peter Freyther | eb55c0d | 2017-07-07 16:53:30 +0200 | [diff] [blame] | 79 | OSMO_GSUP_CHARG_CHAR_IE = 0x14, |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 80 | OSMO_GSUP_RAND_IE = 0x20, |
| 81 | OSMO_GSUP_SRES_IE = 0x21, |
| 82 | OSMO_GSUP_KC_IE = 0x22, |
| 83 | /* 3G support */ |
| 84 | OSMO_GSUP_IK_IE = 0x23, |
| 85 | OSMO_GSUP_CK_IE = 0x24, |
| 86 | OSMO_GSUP_AUTN_IE = 0x25, |
| 87 | OSMO_GSUP_AUTS_IE = 0x26, |
| 88 | OSMO_GSUP_RES_IE = 0x27, |
Harald Welte | 48dc1a5 | 2016-05-05 18:46:42 +0200 | [diff] [blame] | 89 | OSMO_GSUP_CN_DOMAIN_IE = 0x28, |
Neels Hofmeyr | 1b729ce | 2018-12-26 18:13:38 +0100 | [diff] [blame] | 90 | OSMO_GSUP_SUPPORTED_RAT_TYPES_IE = 0x29, /* supported RAT types */ |
| 91 | OSMO_GSUP_CURRENT_RAT_TYPE_IE = 0x2a, /* currently used RAT type */ |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 92 | |
| 93 | OSMO_GSUP_SESSION_ID_IE = 0x30, |
| 94 | OSMO_GSUP_SESSION_STATE_IE = 0x31, |
Vadim Yanitskiy | 36c7b33 | 2018-03-31 05:23:09 +0700 | [diff] [blame] | 95 | |
| 96 | /*! Supplementary Services payload */ |
| 97 | OSMO_GSUP_SS_INFO_IE = 0x35, |
Vadim Yanitskiy | c262831 | 2018-09-25 23:03:13 +0700 | [diff] [blame] | 98 | |
| 99 | /* SM related IEs (see 3GPP TS 29.002, section 7.6.8) */ |
| 100 | OSMO_GSUP_SM_RP_MR_IE = 0x40, |
| 101 | OSMO_GSUP_SM_RP_DA_IE = 0x41, |
| 102 | OSMO_GSUP_SM_RP_OA_IE = 0x42, |
| 103 | OSMO_GSUP_SM_RP_UI_IE = 0x43, |
| 104 | OSMO_GSUP_SM_RP_CAUSE_IE = 0x44, |
| 105 | OSMO_GSUP_SM_RP_MMS_IE = 0x45, |
Vadim Yanitskiy | f9ee8da | 2018-11-13 02:06:15 +0700 | [diff] [blame] | 106 | OSMO_GSUP_SM_ALERT_RSN_IE = 0x46, |
Oliver Smith | 1974240 | 2018-12-21 10:18:28 +0100 | [diff] [blame] | 107 | |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 108 | OSMO_GSUP_IMEI_IE = 0x50, |
| 109 | OSMO_GSUP_IMEI_RESULT_IE = 0x51, |
| 110 | |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 111 | /* Inter-MSC handover related */ |
| 112 | OSMO_GSUP_SOURCE_NAME_IE = 0x60, |
| 113 | OSMO_GSUP_DESTINATION_NAME_IE = 0x61, |
| 114 | OSMO_GSUP_AN_APDU_IE = 0x62, |
| 115 | OSMO_GSUP_CAUSE_RR_IE = 0x63, |
| 116 | OSMO_GSUP_CAUSE_BSSAP_IE = 0x64, |
| 117 | OSMO_GSUP_CAUSE_SM_IE = 0x65, |
| 118 | |
Oliver Smith | 1974240 | 2018-12-21 10:18:28 +0100 | [diff] [blame] | 119 | _OSMO_GSUP_IEI_END_MARKER |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 120 | }; |
| 121 | |
Oliver Smith | d6ff9c8 | 2019-02-01 15:21:25 +0100 | [diff] [blame] | 122 | /*! GSUP message type |
| 123 | * Make sure that new messages follow this scheme: |
| 124 | * .----------------------------. |
| 125 | * | Ending Bits | Category | |
| 126 | * |----------------------------| |
| 127 | * | 00 | Request | |
| 128 | * | 01 | Error | |
| 129 | * | 10 | Result | |
| 130 | * | 11 | Other | |
| 131 | * '----------------------------' |
| 132 | * Request, Error and Result messages must only differ in these last two bits. |
| 133 | */ |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 134 | enum osmo_gsup_message_type { |
| 135 | OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST = 0b00000100, |
| 136 | OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR = 0b00000101, |
| 137 | OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT = 0b00000110, |
| 138 | |
| 139 | OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST = 0b00001000, |
| 140 | OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR = 0b00001001, |
| 141 | OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT = 0b00001010, |
| 142 | |
Harald Welte | de960cb | 2016-06-16 22:57:09 +0200 | [diff] [blame] | 143 | OSMO_GSUP_MSGT_AUTH_FAIL_REPORT = 0b00001011, |
| 144 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 145 | OSMO_GSUP_MSGT_PURGE_MS_REQUEST = 0b00001100, |
| 146 | OSMO_GSUP_MSGT_PURGE_MS_ERROR = 0b00001101, |
| 147 | OSMO_GSUP_MSGT_PURGE_MS_RESULT = 0b00001110, |
| 148 | |
| 149 | OSMO_GSUP_MSGT_INSERT_DATA_REQUEST = 0b00010000, |
| 150 | OSMO_GSUP_MSGT_INSERT_DATA_ERROR = 0b00010001, |
| 151 | OSMO_GSUP_MSGT_INSERT_DATA_RESULT = 0b00010010, |
| 152 | |
| 153 | OSMO_GSUP_MSGT_DELETE_DATA_REQUEST = 0b00010100, |
| 154 | OSMO_GSUP_MSGT_DELETE_DATA_ERROR = 0b00010101, |
| 155 | OSMO_GSUP_MSGT_DELETE_DATA_RESULT = 0b00010110, |
| 156 | |
| 157 | OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST = 0b00011100, |
| 158 | OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR = 0b00011101, |
| 159 | OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT = 0b00011110, |
Vadim Yanitskiy | 36c7b33 | 2018-03-31 05:23:09 +0700 | [diff] [blame] | 160 | |
| 161 | OSMO_GSUP_MSGT_PROC_SS_REQUEST = 0b00100000, |
| 162 | OSMO_GSUP_MSGT_PROC_SS_ERROR = 0b00100001, |
| 163 | OSMO_GSUP_MSGT_PROC_SS_RESULT = 0b00100010, |
Vadim Yanitskiy | c262831 | 2018-09-25 23:03:13 +0700 | [diff] [blame] | 164 | |
| 165 | OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST = 0b00100100, |
| 166 | OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR = 0b00100101, |
| 167 | OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT = 0b00100110, |
| 168 | |
| 169 | OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST = 0b00101000, |
| 170 | OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR = 0b00101001, |
| 171 | OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT = 0b00101010, |
Vadim Yanitskiy | f9ee8da | 2018-11-13 02:06:15 +0700 | [diff] [blame] | 172 | |
| 173 | OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST = 0b00101100, |
| 174 | OSMO_GSUP_MSGT_READY_FOR_SM_ERROR = 0b00101101, |
| 175 | OSMO_GSUP_MSGT_READY_FOR_SM_RESULT = 0b00101110, |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 176 | |
| 177 | OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST = 0b00110000, |
| 178 | OSMO_GSUP_MSGT_CHECK_IMEI_ERROR = 0b00110001, |
| 179 | OSMO_GSUP_MSGT_CHECK_IMEI_RESULT = 0b00110010, |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 180 | |
| 181 | OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST = 0b00110100, |
| 182 | OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR = 0b00110101, |
| 183 | OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT = 0b00110110, |
| 184 | |
| 185 | OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST = 0b00111000, |
| 186 | OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR = 0b00111001, |
| 187 | OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT = 0b00111010, |
| 188 | |
| 189 | OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST = 0b00111100, |
| 190 | OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR = 0b00111101, |
| 191 | OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT = 0b00111110, |
| 192 | |
| 193 | OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST = 0b01000000, |
| 194 | OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST = 0b01000100, |
| 195 | |
| 196 | OSMO_GSUP_MSGT_E_CLOSE = 0b01000111, |
| 197 | OSMO_GSUP_MSGT_E_ABORT = 0b01001011, |
| 198 | |
| 199 | OSMO_GSUP_MSGT_E_ROUTING_ERROR = 0b01001110, |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 200 | }; |
| 201 | |
| 202 | #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00) |
| 203 | #define OSMO_GSUP_IS_MSGT_ERROR(msgt) (((msgt) & 0b00000011) == 0b01) |
| 204 | #define OSMO_GSUP_TO_MSGT_ERROR(msgt) (((msgt) & 0b11111100) | 0b01) |
| 205 | |
Neels Hofmeyr | 10f5fb4 | 2017-02-09 02:09:09 +0100 | [diff] [blame] | 206 | extern const struct value_string osmo_gsup_message_type_names[]; |
| 207 | static inline const char * |
| 208 | osmo_gsup_message_type_name(enum osmo_gsup_message_type val) |
| 209 | { return get_value_string(osmo_gsup_message_type_names, val); } |
| 210 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 211 | enum osmo_gsup_cancel_type { |
| 212 | OSMO_GSUP_CANCEL_TYPE_UPDATE = 1, /* on wire: 0 */ |
| 213 | OSMO_GSUP_CANCEL_TYPE_WITHDRAW = 2, /* on wire: 1 */ |
| 214 | }; |
| 215 | |
Harald Welte | 48dc1a5 | 2016-05-05 18:46:42 +0200 | [diff] [blame] | 216 | enum osmo_gsup_cn_domain { |
| 217 | OSMO_GSUP_CN_DOMAIN_PS = 1, |
| 218 | OSMO_GSUP_CN_DOMAIN_CS = 2, |
| 219 | }; |
| 220 | |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 221 | enum osmo_gsup_imei_result { |
Oliver Smith | d621a1e | 2019-01-08 16:22:30 +0100 | [diff] [blame] | 222 | OSMO_GSUP_IMEI_RESULT_ACK = 1, /* on wire: 0 */ |
| 223 | OSMO_GSUP_IMEI_RESULT_NACK = 2, /* on wire: 1 */ |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 224 | }; |
| 225 | |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 226 | /* 3GPP 29.002 AccessNetworkProtocolId */ |
| 227 | enum osmo_gsup_access_network_protocol { |
| 228 | OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_48006 = 1, |
| 229 | OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_25413 = 2, |
| 230 | }; |
| 231 | |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 232 | /*! TCAP-like session state */ |
| 233 | enum osmo_gsup_session_state { |
| 234 | /*! Undefined session state */ |
| 235 | OSMO_GSUP_SESSION_STATE_NONE = 0x00, |
| 236 | /*! Initiation of a new session */ |
| 237 | OSMO_GSUP_SESSION_STATE_BEGIN = 0x01, |
| 238 | /*! Communication of an existing session */ |
| 239 | OSMO_GSUP_SESSION_STATE_CONTINUE = 0x02, |
| 240 | /*! Indication of the session end */ |
| 241 | OSMO_GSUP_SESSION_STATE_END = 0x03, |
| 242 | }; |
| 243 | |
Harald Welte | 6a6a609 | 2018-06-16 11:10:12 +0200 | [diff] [blame] | 244 | extern const struct value_string osmo_gsup_session_state_names[]; |
| 245 | static inline const char * |
| 246 | osmo_gsup_session_state_name(enum osmo_gsup_session_state val) |
| 247 | { return get_value_string(osmo_gsup_session_state_names, val); } |
| 248 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 249 | /*! parsed/decoded PDP context information */ |
| 250 | struct osmo_gsup_pdp_info { |
| 251 | unsigned int context_id; |
| 252 | int have_info; |
| 253 | /*! Type of PDP context */ |
| 254 | uint16_t pdp_type; |
| 255 | /*! APN information, still in encoded form. Can be NULL if no |
| 256 | * APN information included */ |
| 257 | const uint8_t *apn_enc; |
| 258 | /*! length (in octets) of apn_enc */ |
| 259 | size_t apn_enc_len; |
| 260 | /*! QoS information, still in encoded form. Can be NULL if no |
| 261 | * QoS information included */ |
| 262 | const uint8_t *qos_enc; |
| 263 | /*! length (in octets) of qos_enc */ |
| 264 | size_t qos_enc_len; |
Holger Hans Peter Freyther | eb55c0d | 2017-07-07 16:53:30 +0200 | [diff] [blame] | 265 | /*! PDP Charging Characteristics, still in encoded form. Can be NULL if no |
| 266 | * PDP Charging Characteristics */ |
| 267 | const uint8_t *pdp_charg_enc; |
| 268 | /*! length (in octets) of pdp_charg_enc */ |
| 269 | size_t pdp_charg_enc_len; |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 270 | }; |
| 271 | |
Neels Hofmeyr | 9838c90 | 2019-04-01 22:24:33 +0200 | [diff] [blame] | 272 | enum osmo_gsup_message_class { |
| 273 | OSMO_GSUP_MESSAGE_CLASS_UNSET = 0, |
| 274 | OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT = 1, |
| 275 | OSMO_GSUP_MESSAGE_CLASS_SMS = 2, |
| 276 | OSMO_GSUP_MESSAGE_CLASS_USSD = 3, |
| 277 | OSMO_GSUP_MESSAGE_CLASS_INTER_MSC = 4, |
| 278 | /* Keep this as last entry with a value of max(enum osmo_gsup_message_class) + 1. |
| 279 | * This value shall serve as the size for an array to aid de-muxing all known GSUP classes. */ |
| 280 | OSMO_GSUP_MESSAGE_CLASS_ARRAYSIZE |
| 281 | }; |
| 282 | |
| 283 | extern const struct value_string osmo_gsup_message_class_names[]; |
| 284 | static inline const char *osmo_gsup_message_class_name(enum osmo_gsup_message_class val) |
| 285 | { return get_value_string(osmo_gsup_message_class_names, val); } |
| 286 | |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 287 | /*! AccessNetworkSignalInfo as in 3GPP TS 29.002. */ |
| 288 | struct osmo_gsup_an_apdu { |
| 289 | /* AccessNetworkProtocolId as in 3GPP TS 29.002. */ |
| 290 | enum osmo_gsup_access_network_protocol access_network_proto; |
| 291 | const uint8_t *data; |
| 292 | size_t data_len; |
| 293 | }; |
| 294 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 295 | /*! parsed/decoded GSUP protocol message */ |
| 296 | struct osmo_gsup_message { |
| 297 | enum osmo_gsup_message_type message_type; |
Neels Hofmeyr | 0ee798a | 2019-04-10 19:13:19 +0200 | [diff] [blame] | 298 | char imsi[OSMO_IMSI_BUF_SIZE]; |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 299 | enum gsm48_gmm_cause cause; |
| 300 | enum osmo_gsup_cancel_type cancel_type; |
| 301 | int pdp_info_compl; |
| 302 | int freeze_ptmsi; |
| 303 | struct osmo_auth_vector auth_vectors[OSMO_GSUP_MAX_NUM_AUTH_INFO]; |
| 304 | size_t num_auth_vectors; |
| 305 | struct osmo_gsup_pdp_info pdp_infos[OSMO_GSUP_MAX_NUM_PDP_INFO]; |
| 306 | size_t num_pdp_infos; |
| 307 | const uint8_t *msisdn_enc; |
| 308 | size_t msisdn_enc_len; |
| 309 | const uint8_t *hlr_enc; |
| 310 | size_t hlr_enc_len; |
| 311 | const uint8_t *auts; |
Harald Welte | 766da86 | 2016-05-06 11:18:15 +0200 | [diff] [blame] | 312 | const uint8_t *rand; |
Harald Welte | 48dc1a5 | 2016-05-05 18:46:42 +0200 | [diff] [blame] | 313 | enum osmo_gsup_cn_domain cn_domain; |
Holger Hans Peter Freyther | eb55c0d | 2017-07-07 16:53:30 +0200 | [diff] [blame] | 314 | const uint8_t *pdp_charg_enc; |
| 315 | size_t pdp_charg_enc_len; |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 316 | |
| 317 | /*! Session state \ref osmo_gsup_session_state */ |
| 318 | enum osmo_gsup_session_state session_state; |
| 319 | /*! Unique session identifier and origination flag. |
Vadim Yanitskiy | 5a7b465 | 2018-11-06 18:24:49 +0700 | [diff] [blame] | 320 | * Encoded only when \ref session_state != 0x00 */ |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 321 | uint32_t session_id; |
Vadim Yanitskiy | 36c7b33 | 2018-03-31 05:23:09 +0700 | [diff] [blame] | 322 | |
| 323 | /*! ASN.1 encoded MAP payload for Supplementary Services */ |
| 324 | uint8_t *ss_info; |
| 325 | size_t ss_info_len; |
Vadim Yanitskiy | c262831 | 2018-09-25 23:03:13 +0700 | [diff] [blame] | 326 | |
| 327 | /*! SM-RP-MR (see 3GPP TS 29.002, 7.6.1.1), Message Reference. |
| 328 | * Please note that there is no SM-RP-MR in TCAP/MAP! SM-RP-MR |
| 329 | * is usually mapped to TCAP's InvokeID, but we don't need it. */ |
| 330 | const uint8_t *sm_rp_mr; |
| 331 | /*! SM-RP-DA (see 3GPP TS 29.002, 7.6.8.1), Destination Address */ |
| 332 | enum osmo_gsup_sms_sm_rp_oda_t sm_rp_da_type; |
| 333 | size_t sm_rp_da_len; |
| 334 | const uint8_t *sm_rp_da; |
| 335 | /*! SM-RP-OA (see 3GPP TS 29.002, 7.6.8.2), Originating Address */ |
| 336 | enum osmo_gsup_sms_sm_rp_oda_t sm_rp_oa_type; |
| 337 | size_t sm_rp_oa_len; |
| 338 | const uint8_t *sm_rp_oa; |
| 339 | /*! SM-RP-UI (see 3GPP TS 29.002, 7.6.8.4), SMS TPDU */ |
| 340 | const uint8_t *sm_rp_ui; |
| 341 | size_t sm_rp_ui_len; |
| 342 | /*! SM-RP-Cause value (1 oct.) as per GSM TS 04.11, section 8.2.5.4 */ |
| 343 | const uint8_t *sm_rp_cause; |
| 344 | /*! SM-RP-MMS (More Messages to Send), section 7.6.8.7 */ |
| 345 | const uint8_t *sm_rp_mms; |
Vadim Yanitskiy | f9ee8da | 2018-11-13 02:06:15 +0700 | [diff] [blame] | 346 | /*! Alert reason (see 3GPP TS 29.002, 7.6.8.8) */ |
| 347 | enum osmo_gsup_sms_sm_alert_rsn_t sm_alert_rsn; |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 348 | |
| 349 | const uint8_t *imei_enc; |
| 350 | size_t imei_enc_len; |
| 351 | enum osmo_gsup_imei_result imei_result; |
Neels Hofmeyr | 9838c90 | 2019-04-01 22:24:33 +0200 | [diff] [blame] | 352 | |
| 353 | /*! Indicate the message class to trivially dispatch incoming GSUP messages to the right code paths. |
Oliver Smith | e0c5d70 | 2019-05-16 14:55:04 +0200 | [diff] [blame] | 354 | * Inter-MSC messages are *required* to set a class = OSMO_GSUP_MESSAGE_CLASS_INTER_MSC. For older message |
| 355 | * classes, this may be omitted (for backwards compatibility only -- if in doubt, include it). */ |
Neels Hofmeyr | 9838c90 | 2019-04-01 22:24:33 +0200 | [diff] [blame] | 356 | enum osmo_gsup_message_class message_class; |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 357 | |
| 358 | /*! For messages routed via another GSUP entity (via HLR), the IPA name of the entity that sent this message. */ |
| 359 | const uint8_t *source_name; |
| 360 | /*! Number of bytes in source_name. */ |
| 361 | size_t source_name_len; |
| 362 | /*! For messages routed via another GSUP entity (via HLR), the IPA name of the entity that should ultimately |
| 363 | * receive this message. */ |
| 364 | const uint8_t *destination_name; |
| 365 | /*! Number of bytes in destination_name. */ |
| 366 | size_t destination_name_len; |
| 367 | |
| 368 | /*! inter-MSC AN-APDU. */ |
| 369 | struct osmo_gsup_an_apdu an_apdu; |
| 370 | |
| 371 | uint8_t cause_rr; /*!< 0 is a valid cause */ |
| 372 | bool cause_rr_set; /*!< whether cause_rr is set */ |
| 373 | |
| 374 | enum gsm0808_cause cause_bssap; /*!< 0 is a valid cause */ |
| 375 | bool cause_bssap_set; /*!< whether cause_bssap is set */ |
| 376 | |
| 377 | /*! Session Management cause as of 3GPP TS 24.008 10.5.6.6 / Table 10.5.157. */ |
| 378 | enum gsm48_gsm_cause cause_sm; |
Neels Hofmeyr | 1b729ce | 2018-12-26 18:13:38 +0100 | [diff] [blame] | 379 | |
| 380 | enum osmo_rat_type current_rat_type; |
| 381 | enum osmo_rat_type supported_rat_types[8]; /*!< arbitrary choice */ |
| 382 | size_t supported_rat_types_len; |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 383 | }; |
| 384 | |
| 385 | int osmo_gsup_decode(const uint8_t *data, size_t data_len, |
| 386 | struct osmo_gsup_message *gsup_msg); |
Max | 80f4c4e | 2018-01-24 12:33:05 +0100 | [diff] [blame] | 387 | int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg); |
Oliver Smith | d6ff9c8 | 2019-02-01 15:21:25 +0100 | [diff] [blame] | 388 | int osmo_gsup_get_err_msg_type(enum osmo_gsup_message_type type_in) |
| 389 | OSMO_DEPRECATED("Use OSMO_GSUP_TO_MSGT_ERROR() instead"); |
Harald Welte | 381a1aa | 2017-10-16 18:31:20 +0200 | [diff] [blame] | 390 | |
| 391 | /*! @} */ |