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, |
Harald Welte | 49ddef6 | 2019-08-16 12:22:29 +0200 | [diff] [blame] | 110 | OSMO_GSUP_NUM_VECTORS_REQ_IE = 0x52, |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 111 | |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 112 | /* Inter-MSC handover related */ |
| 113 | OSMO_GSUP_SOURCE_NAME_IE = 0x60, |
| 114 | OSMO_GSUP_DESTINATION_NAME_IE = 0x61, |
| 115 | OSMO_GSUP_AN_APDU_IE = 0x62, |
| 116 | OSMO_GSUP_CAUSE_RR_IE = 0x63, |
| 117 | OSMO_GSUP_CAUSE_BSSAP_IE = 0x64, |
| 118 | OSMO_GSUP_CAUSE_SM_IE = 0x65, |
| 119 | |
Oliver Smith | 1974240 | 2018-12-21 10:18:28 +0100 | [diff] [blame] | 120 | _OSMO_GSUP_IEI_END_MARKER |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 121 | }; |
| 122 | |
Oliver Smith | d6ff9c8 | 2019-02-01 15:21:25 +0100 | [diff] [blame] | 123 | /*! GSUP message type |
| 124 | * Make sure that new messages follow this scheme: |
| 125 | * .----------------------------. |
| 126 | * | Ending Bits | Category | |
| 127 | * |----------------------------| |
| 128 | * | 00 | Request | |
| 129 | * | 01 | Error | |
| 130 | * | 10 | Result | |
| 131 | * | 11 | Other | |
| 132 | * '----------------------------' |
| 133 | * Request, Error and Result messages must only differ in these last two bits. |
| 134 | */ |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 135 | enum osmo_gsup_message_type { |
| 136 | OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST = 0b00000100, |
| 137 | OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR = 0b00000101, |
| 138 | OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT = 0b00000110, |
| 139 | |
| 140 | OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST = 0b00001000, |
| 141 | OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR = 0b00001001, |
| 142 | OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT = 0b00001010, |
| 143 | |
Harald Welte | de960cb | 2016-06-16 22:57:09 +0200 | [diff] [blame] | 144 | OSMO_GSUP_MSGT_AUTH_FAIL_REPORT = 0b00001011, |
| 145 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 146 | OSMO_GSUP_MSGT_PURGE_MS_REQUEST = 0b00001100, |
| 147 | OSMO_GSUP_MSGT_PURGE_MS_ERROR = 0b00001101, |
| 148 | OSMO_GSUP_MSGT_PURGE_MS_RESULT = 0b00001110, |
| 149 | |
| 150 | OSMO_GSUP_MSGT_INSERT_DATA_REQUEST = 0b00010000, |
| 151 | OSMO_GSUP_MSGT_INSERT_DATA_ERROR = 0b00010001, |
| 152 | OSMO_GSUP_MSGT_INSERT_DATA_RESULT = 0b00010010, |
| 153 | |
| 154 | OSMO_GSUP_MSGT_DELETE_DATA_REQUEST = 0b00010100, |
| 155 | OSMO_GSUP_MSGT_DELETE_DATA_ERROR = 0b00010101, |
| 156 | OSMO_GSUP_MSGT_DELETE_DATA_RESULT = 0b00010110, |
| 157 | |
| 158 | OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST = 0b00011100, |
| 159 | OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR = 0b00011101, |
| 160 | OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT = 0b00011110, |
Vadim Yanitskiy | 36c7b33 | 2018-03-31 05:23:09 +0700 | [diff] [blame] | 161 | |
| 162 | OSMO_GSUP_MSGT_PROC_SS_REQUEST = 0b00100000, |
| 163 | OSMO_GSUP_MSGT_PROC_SS_ERROR = 0b00100001, |
| 164 | OSMO_GSUP_MSGT_PROC_SS_RESULT = 0b00100010, |
Vadim Yanitskiy | c262831 | 2018-09-25 23:03:13 +0700 | [diff] [blame] | 165 | |
| 166 | OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST = 0b00100100, |
| 167 | OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR = 0b00100101, |
| 168 | OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT = 0b00100110, |
| 169 | |
| 170 | OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST = 0b00101000, |
| 171 | OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR = 0b00101001, |
| 172 | OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT = 0b00101010, |
Vadim Yanitskiy | f9ee8da | 2018-11-13 02:06:15 +0700 | [diff] [blame] | 173 | |
| 174 | OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST = 0b00101100, |
| 175 | OSMO_GSUP_MSGT_READY_FOR_SM_ERROR = 0b00101101, |
| 176 | OSMO_GSUP_MSGT_READY_FOR_SM_RESULT = 0b00101110, |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 177 | |
| 178 | OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST = 0b00110000, |
| 179 | OSMO_GSUP_MSGT_CHECK_IMEI_ERROR = 0b00110001, |
| 180 | OSMO_GSUP_MSGT_CHECK_IMEI_RESULT = 0b00110010, |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 181 | |
| 182 | OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST = 0b00110100, |
| 183 | OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR = 0b00110101, |
| 184 | OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT = 0b00110110, |
| 185 | |
| 186 | OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST = 0b00111000, |
| 187 | OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR = 0b00111001, |
| 188 | OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT = 0b00111010, |
| 189 | |
| 190 | OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST = 0b00111100, |
| 191 | OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR = 0b00111101, |
| 192 | OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT = 0b00111110, |
| 193 | |
| 194 | OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST = 0b01000000, |
| 195 | OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST = 0b01000100, |
| 196 | |
| 197 | OSMO_GSUP_MSGT_E_CLOSE = 0b01000111, |
| 198 | OSMO_GSUP_MSGT_E_ABORT = 0b01001011, |
| 199 | |
Neels Hofmeyr | 249e005 | 2019-11-20 21:28:47 +0100 | [diff] [blame] | 200 | OSMO_GSUP_MSGT_ROUTING_ERROR = 0b01001110, |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 201 | }; |
| 202 | |
Neels Hofmeyr | 249e005 | 2019-11-20 21:28:47 +0100 | [diff] [blame] | 203 | #define OSMO_GSUP_MSGT_E_ROUTING_ERROR OSMO_GSUP_MSGT_ROUTING_ERROR |
| 204 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 205 | #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00) |
| 206 | #define OSMO_GSUP_IS_MSGT_ERROR(msgt) (((msgt) & 0b00000011) == 0b01) |
Neels Hofmeyr | 1536423 | 2019-11-07 08:25:24 +0100 | [diff] [blame] | 207 | #define OSMO_GSUP_IS_MSGT_RESULT(msgt) (((msgt) & 0b00000011) == 0b10) |
| 208 | #define OSMO_GSUP_TO_MSGT_REQUEST(msgt) (((msgt) & 0b11111100)) |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 209 | #define OSMO_GSUP_TO_MSGT_ERROR(msgt) (((msgt) & 0b11111100) | 0b01) |
Neels Hofmeyr | 1536423 | 2019-11-07 08:25:24 +0100 | [diff] [blame] | 210 | #define OSMO_GSUP_TO_MSGT_RESULT(msgt) (((msgt) & 0b11111100) | 0b10) |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 211 | |
Neels Hofmeyr | 10f5fb4 | 2017-02-09 02:09:09 +0100 | [diff] [blame] | 212 | extern const struct value_string osmo_gsup_message_type_names[]; |
| 213 | static inline const char * |
| 214 | osmo_gsup_message_type_name(enum osmo_gsup_message_type val) |
| 215 | { return get_value_string(osmo_gsup_message_type_names, val); } |
| 216 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 217 | enum osmo_gsup_cancel_type { |
| 218 | OSMO_GSUP_CANCEL_TYPE_UPDATE = 1, /* on wire: 0 */ |
| 219 | OSMO_GSUP_CANCEL_TYPE_WITHDRAW = 2, /* on wire: 1 */ |
| 220 | }; |
| 221 | |
Harald Welte | 48dc1a5 | 2016-05-05 18:46:42 +0200 | [diff] [blame] | 222 | enum osmo_gsup_cn_domain { |
| 223 | OSMO_GSUP_CN_DOMAIN_PS = 1, |
| 224 | OSMO_GSUP_CN_DOMAIN_CS = 2, |
| 225 | }; |
| 226 | |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 227 | enum osmo_gsup_imei_result { |
Oliver Smith | d621a1e | 2019-01-08 16:22:30 +0100 | [diff] [blame] | 228 | OSMO_GSUP_IMEI_RESULT_ACK = 1, /* on wire: 0 */ |
| 229 | OSMO_GSUP_IMEI_RESULT_NACK = 2, /* on wire: 1 */ |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 230 | }; |
| 231 | |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 232 | /* 3GPP 29.002 AccessNetworkProtocolId */ |
| 233 | enum osmo_gsup_access_network_protocol { |
| 234 | OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_48006 = 1, |
| 235 | OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_25413 = 2, |
| 236 | }; |
| 237 | |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 238 | /*! TCAP-like session state */ |
| 239 | enum osmo_gsup_session_state { |
| 240 | /*! Undefined session state */ |
| 241 | OSMO_GSUP_SESSION_STATE_NONE = 0x00, |
| 242 | /*! Initiation of a new session */ |
| 243 | OSMO_GSUP_SESSION_STATE_BEGIN = 0x01, |
| 244 | /*! Communication of an existing session */ |
| 245 | OSMO_GSUP_SESSION_STATE_CONTINUE = 0x02, |
| 246 | /*! Indication of the session end */ |
| 247 | OSMO_GSUP_SESSION_STATE_END = 0x03, |
| 248 | }; |
| 249 | |
Harald Welte | 6a6a609 | 2018-06-16 11:10:12 +0200 | [diff] [blame] | 250 | extern const struct value_string osmo_gsup_session_state_names[]; |
| 251 | static inline const char * |
| 252 | osmo_gsup_session_state_name(enum osmo_gsup_session_state val) |
| 253 | { return get_value_string(osmo_gsup_session_state_names, val); } |
| 254 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 255 | /*! parsed/decoded PDP context information */ |
| 256 | struct osmo_gsup_pdp_info { |
| 257 | unsigned int context_id; |
| 258 | int have_info; |
| 259 | /*! Type of PDP context */ |
| 260 | uint16_t pdp_type; |
| 261 | /*! APN information, still in encoded form. Can be NULL if no |
| 262 | * APN information included */ |
| 263 | const uint8_t *apn_enc; |
| 264 | /*! length (in octets) of apn_enc */ |
| 265 | size_t apn_enc_len; |
| 266 | /*! QoS information, still in encoded form. Can be NULL if no |
| 267 | * QoS information included */ |
| 268 | const uint8_t *qos_enc; |
| 269 | /*! length (in octets) of qos_enc */ |
| 270 | size_t qos_enc_len; |
Holger Hans Peter Freyther | eb55c0d | 2017-07-07 16:53:30 +0200 | [diff] [blame] | 271 | /*! PDP Charging Characteristics, still in encoded form. Can be NULL if no |
| 272 | * PDP Charging Characteristics */ |
| 273 | const uint8_t *pdp_charg_enc; |
| 274 | /*! length (in octets) of pdp_charg_enc */ |
| 275 | size_t pdp_charg_enc_len; |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 276 | }; |
| 277 | |
Neels Hofmeyr | 9838c90 | 2019-04-01 22:24:33 +0200 | [diff] [blame] | 278 | enum osmo_gsup_message_class { |
| 279 | OSMO_GSUP_MESSAGE_CLASS_UNSET = 0, |
| 280 | OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT = 1, |
| 281 | OSMO_GSUP_MESSAGE_CLASS_SMS = 2, |
| 282 | OSMO_GSUP_MESSAGE_CLASS_USSD = 3, |
| 283 | OSMO_GSUP_MESSAGE_CLASS_INTER_MSC = 4, |
| 284 | /* Keep this as last entry with a value of max(enum osmo_gsup_message_class) + 1. |
| 285 | * This value shall serve as the size for an array to aid de-muxing all known GSUP classes. */ |
| 286 | OSMO_GSUP_MESSAGE_CLASS_ARRAYSIZE |
| 287 | }; |
| 288 | |
| 289 | extern const struct value_string osmo_gsup_message_class_names[]; |
| 290 | static inline const char *osmo_gsup_message_class_name(enum osmo_gsup_message_class val) |
| 291 | { return get_value_string(osmo_gsup_message_class_names, val); } |
| 292 | |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 293 | /*! AccessNetworkSignalInfo as in 3GPP TS 29.002. */ |
| 294 | struct osmo_gsup_an_apdu { |
| 295 | /* AccessNetworkProtocolId as in 3GPP TS 29.002. */ |
| 296 | enum osmo_gsup_access_network_protocol access_network_proto; |
| 297 | const uint8_t *data; |
| 298 | size_t data_len; |
| 299 | }; |
| 300 | |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 301 | /*! parsed/decoded GSUP protocol message */ |
| 302 | struct osmo_gsup_message { |
| 303 | enum osmo_gsup_message_type message_type; |
Neels Hofmeyr | 0ee798a | 2019-04-10 19:13:19 +0200 | [diff] [blame] | 304 | char imsi[OSMO_IMSI_BUF_SIZE]; |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 305 | enum gsm48_gmm_cause cause; |
| 306 | enum osmo_gsup_cancel_type cancel_type; |
| 307 | int pdp_info_compl; |
| 308 | int freeze_ptmsi; |
| 309 | struct osmo_auth_vector auth_vectors[OSMO_GSUP_MAX_NUM_AUTH_INFO]; |
| 310 | size_t num_auth_vectors; |
| 311 | struct osmo_gsup_pdp_info pdp_infos[OSMO_GSUP_MAX_NUM_PDP_INFO]; |
| 312 | size_t num_pdp_infos; |
| 313 | const uint8_t *msisdn_enc; |
| 314 | size_t msisdn_enc_len; |
| 315 | const uint8_t *hlr_enc; |
| 316 | size_t hlr_enc_len; |
| 317 | const uint8_t *auts; |
Harald Welte | 766da86 | 2016-05-06 11:18:15 +0200 | [diff] [blame] | 318 | const uint8_t *rand; |
Harald Welte | 48dc1a5 | 2016-05-05 18:46:42 +0200 | [diff] [blame] | 319 | enum osmo_gsup_cn_domain cn_domain; |
Holger Hans Peter Freyther | eb55c0d | 2017-07-07 16:53:30 +0200 | [diff] [blame] | 320 | const uint8_t *pdp_charg_enc; |
| 321 | size_t pdp_charg_enc_len; |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 322 | |
| 323 | /*! Session state \ref osmo_gsup_session_state */ |
| 324 | enum osmo_gsup_session_state session_state; |
| 325 | /*! Unique session identifier and origination flag. |
Vadim Yanitskiy | 5a7b465 | 2018-11-06 18:24:49 +0700 | [diff] [blame] | 326 | * Encoded only when \ref session_state != 0x00 */ |
Vadim Yanitskiy | 7269604 | 2018-04-07 02:34:55 +0700 | [diff] [blame] | 327 | uint32_t session_id; |
Vadim Yanitskiy | 36c7b33 | 2018-03-31 05:23:09 +0700 | [diff] [blame] | 328 | |
| 329 | /*! ASN.1 encoded MAP payload for Supplementary Services */ |
| 330 | uint8_t *ss_info; |
| 331 | size_t ss_info_len; |
Vadim Yanitskiy | c262831 | 2018-09-25 23:03:13 +0700 | [diff] [blame] | 332 | |
| 333 | /*! SM-RP-MR (see 3GPP TS 29.002, 7.6.1.1), Message Reference. |
| 334 | * Please note that there is no SM-RP-MR in TCAP/MAP! SM-RP-MR |
| 335 | * is usually mapped to TCAP's InvokeID, but we don't need it. */ |
| 336 | const uint8_t *sm_rp_mr; |
| 337 | /*! SM-RP-DA (see 3GPP TS 29.002, 7.6.8.1), Destination Address */ |
| 338 | enum osmo_gsup_sms_sm_rp_oda_t sm_rp_da_type; |
| 339 | size_t sm_rp_da_len; |
| 340 | const uint8_t *sm_rp_da; |
| 341 | /*! SM-RP-OA (see 3GPP TS 29.002, 7.6.8.2), Originating Address */ |
| 342 | enum osmo_gsup_sms_sm_rp_oda_t sm_rp_oa_type; |
| 343 | size_t sm_rp_oa_len; |
| 344 | const uint8_t *sm_rp_oa; |
| 345 | /*! SM-RP-UI (see 3GPP TS 29.002, 7.6.8.4), SMS TPDU */ |
| 346 | const uint8_t *sm_rp_ui; |
| 347 | size_t sm_rp_ui_len; |
| 348 | /*! SM-RP-Cause value (1 oct.) as per GSM TS 04.11, section 8.2.5.4 */ |
| 349 | const uint8_t *sm_rp_cause; |
| 350 | /*! SM-RP-MMS (More Messages to Send), section 7.6.8.7 */ |
| 351 | const uint8_t *sm_rp_mms; |
Vadim Yanitskiy | f9ee8da | 2018-11-13 02:06:15 +0700 | [diff] [blame] | 352 | /*! Alert reason (see 3GPP TS 29.002, 7.6.8.8) */ |
| 353 | enum osmo_gsup_sms_sm_alert_rsn_t sm_alert_rsn; |
Oliver Smith | 10db281 | 2018-12-14 16:14:34 +0100 | [diff] [blame] | 354 | |
| 355 | const uint8_t *imei_enc; |
| 356 | size_t imei_enc_len; |
| 357 | enum osmo_gsup_imei_result imei_result; |
Neels Hofmeyr | 9838c90 | 2019-04-01 22:24:33 +0200 | [diff] [blame] | 358 | |
| 359 | /*! 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] | 360 | * Inter-MSC messages are *required* to set a class = OSMO_GSUP_MESSAGE_CLASS_INTER_MSC. For older message |
| 361 | * 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] | 362 | enum osmo_gsup_message_class message_class; |
Oliver Smith | affbb20 | 2019-02-01 11:35:10 +0100 | [diff] [blame] | 363 | |
| 364 | /*! For messages routed via another GSUP entity (via HLR), the IPA name of the entity that sent this message. */ |
| 365 | const uint8_t *source_name; |
| 366 | /*! Number of bytes in source_name. */ |
| 367 | size_t source_name_len; |
| 368 | /*! For messages routed via another GSUP entity (via HLR), the IPA name of the entity that should ultimately |
| 369 | * receive this message. */ |
| 370 | const uint8_t *destination_name; |
| 371 | /*! Number of bytes in destination_name. */ |
| 372 | size_t destination_name_len; |
| 373 | |
| 374 | /*! inter-MSC AN-APDU. */ |
| 375 | struct osmo_gsup_an_apdu an_apdu; |
| 376 | |
| 377 | uint8_t cause_rr; /*!< 0 is a valid cause */ |
| 378 | bool cause_rr_set; /*!< whether cause_rr is set */ |
| 379 | |
| 380 | enum gsm0808_cause cause_bssap; /*!< 0 is a valid cause */ |
| 381 | bool cause_bssap_set; /*!< whether cause_bssap is set */ |
| 382 | |
| 383 | /*! Session Management cause as of 3GPP TS 24.008 10.5.6.6 / Table 10.5.157. */ |
| 384 | enum gsm48_gsm_cause cause_sm; |
Neels Hofmeyr | 1b729ce | 2018-12-26 18:13:38 +0100 | [diff] [blame] | 385 | |
| 386 | enum osmo_rat_type current_rat_type; |
| 387 | enum osmo_rat_type supported_rat_types[8]; /*!< arbitrary choice */ |
| 388 | size_t supported_rat_types_len; |
Harald Welte | 3b6fb08 | 2016-04-25 18:46:22 +0200 | [diff] [blame] | 389 | }; |
| 390 | |
| 391 | int osmo_gsup_decode(const uint8_t *data, size_t data_len, |
| 392 | struct osmo_gsup_message *gsup_msg); |
Max | 80f4c4e | 2018-01-24 12:33:05 +0100 | [diff] [blame] | 393 | 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] | 394 | int osmo_gsup_get_err_msg_type(enum osmo_gsup_message_type type_in) |
| 395 | OSMO_DEPRECATED("Use OSMO_GSUP_TO_MSGT_ERROR() instead"); |
Harald Welte | 381a1aa | 2017-10-16 18:31:20 +0200 | [diff] [blame] | 396 | |
| 397 | /*! @} */ |