summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/osmocom/gsm/gsup.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h
index 7f304a3c..1374e0ed 100644
--- a/include/osmocom/gsm/gsup.h
+++ b/include/osmocom/gsm/gsup.h
@@ -42,7 +42,9 @@
#include <osmocom/core/msgb.h>
#include <osmocom/gsm/gsup_sms.h>
#include <osmocom/gsm/protocol/gsm_23_003.h>
+#include <osmocom/gsm/protocol/gsm_03_40.h>
#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
+#include <osmocom/gsm/protocol/gsm_08_08.h>
#include <osmocom/crypt/auth.h>
#define OSMO_GSUP_PORT 4222
@@ -103,6 +105,14 @@ enum osmo_gsup_iei {
OSMO_GSUP_IMEI_IE = 0x50,
OSMO_GSUP_IMEI_RESULT_IE = 0x51,
+ /* Inter-MSC handover related */
+ OSMO_GSUP_SOURCE_NAME_IE = 0x60,
+ OSMO_GSUP_DESTINATION_NAME_IE = 0x61,
+ OSMO_GSUP_AN_APDU_IE = 0x62,
+ OSMO_GSUP_CAUSE_RR_IE = 0x63,
+ OSMO_GSUP_CAUSE_BSSAP_IE = 0x64,
+ OSMO_GSUP_CAUSE_SM_IE = 0x65,
+
_OSMO_GSUP_IEI_END_MARKER
};
@@ -164,6 +174,26 @@ enum osmo_gsup_message_type {
OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST = 0b00110000,
OSMO_GSUP_MSGT_CHECK_IMEI_ERROR = 0b00110001,
OSMO_GSUP_MSGT_CHECK_IMEI_RESULT = 0b00110010,
+
+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST = 0b00110100,
+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR = 0b00110101,
+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT = 0b00110110,
+
+ OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST = 0b00111000,
+ OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR = 0b00111001,
+ OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT = 0b00111010,
+
+ OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST = 0b00111100,
+ OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR = 0b00111101,
+ OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT = 0b00111110,
+
+ OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST = 0b01000000,
+ OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST = 0b01000100,
+
+ OSMO_GSUP_MSGT_E_CLOSE = 0b01000111,
+ OSMO_GSUP_MSGT_E_ABORT = 0b01001011,
+
+ OSMO_GSUP_MSGT_E_ROUTING_ERROR = 0b01001110,
};
#define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)
@@ -190,6 +220,12 @@ enum osmo_gsup_imei_result {
OSMO_GSUP_IMEI_RESULT_NACK = 2, /* on wire: 1 */
};
+/* 3GPP 29.002 AccessNetworkProtocolId */
+enum osmo_gsup_access_network_protocol {
+ OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_48006 = 1,
+ OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_25413 = 2,
+};
+
/*! TCAP-like session state */
enum osmo_gsup_session_state {
/*! Undefined session state */
@@ -245,6 +281,14 @@ extern const struct value_string osmo_gsup_message_class_names[];
static inline const char *osmo_gsup_message_class_name(enum osmo_gsup_message_class val)
{ return get_value_string(osmo_gsup_message_class_names, val); }
+/*! AccessNetworkSignalInfo as in 3GPP TS 29.002. */
+struct osmo_gsup_an_apdu {
+ /* AccessNetworkProtocolId as in 3GPP TS 29.002. */
+ enum osmo_gsup_access_network_protocol access_network_proto;
+ const uint8_t *data;
+ size_t data_len;
+};
+
/*! parsed/decoded GSUP protocol message */
struct osmo_gsup_message {
enum osmo_gsup_message_type message_type;
@@ -307,6 +351,28 @@ struct osmo_gsup_message {
* Inter-MSC messages are *required* to set a class = OSMO_GSUP_MESSAGE_CLASS_INTER_MSC. For older message classes, this may
* be omitted (for backwards compatibility only -- if in doubt, include it). */
enum osmo_gsup_message_class message_class;
+
+ /*! For messages routed via another GSUP entity (via HLR), the IPA name of the entity that sent this message. */
+ const uint8_t *source_name;
+ /*! Number of bytes in source_name. */
+ size_t source_name_len;
+ /*! For messages routed via another GSUP entity (via HLR), the IPA name of the entity that should ultimately
+ * receive this message. */
+ const uint8_t *destination_name;
+ /*! Number of bytes in destination_name. */
+ size_t destination_name_len;
+
+ /*! inter-MSC AN-APDU. */
+ struct osmo_gsup_an_apdu an_apdu;
+
+ uint8_t cause_rr; /*!< 0 is a valid cause */
+ bool cause_rr_set; /*!< whether cause_rr is set */
+
+ enum gsm0808_cause cause_bssap; /*!< 0 is a valid cause */
+ bool cause_bssap_set; /*!< whether cause_bssap is set */
+
+ /*! Session Management cause as of 3GPP TS 24.008 10.5.6.6 / Table 10.5.157. */
+ enum gsm48_gsm_cause cause_sm;
};
int osmo_gsup_decode(const uint8_t *data, size_t data_len,