aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-10-07 20:10:57 +0200
committerHarald Welte <laforge@gnumonks.org>2018-10-21 12:35:34 +0000
commit6721144c80c1160e28a2da86b0f33e050fe9adaf (patch)
treed02e00ff2efb89e5c75a1ee24f028dcade2e09e6
parentfb97e72e52008da2667599a458bb435129510646 (diff)
SGsAP protocol definitions (header + C file)
-rw-r--r--include/Makefile.am1
-rw-r--r--include/osmocom/gsm/protocol/gsm_29_118.h169
-rw-r--r--src/gsm/Makefile.am3
-rw-r--r--src/gsm/gsm29118.c123
-rw-r--r--src/gsm/libosmogsm.map9
5 files changed, 304 insertions, 1 deletions
diff --git a/include/Makefile.am b/include/Makefile.am
index 19695d1b..59a5feda 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -114,6 +114,7 @@ nobase_include_HEADERS = \
osmocom/gsm/protocol/gsm_09_02.h \
osmocom/gsm/protocol/gsm_12_21.h \
osmocom/gsm/protocol/gsm_23_003.h \
+ osmocom/gsm/protocol/gsm_29_118.h \
osmocom/gsm/protocol/gsm_44_318.h \
osmocom/gsm/protocol/ipaccess.h \
osmocom/gsm/protocol/smpp34_osmocom.h \
diff --git a/include/osmocom/gsm/protocol/gsm_29_118.h b/include/osmocom/gsm/protocol/gsm_29_118.h
new file mode 100644
index 00000000..24e9de2e
--- /dev/null
+++ b/include/osmocom/gsm/protocol/gsm_29_118.h
@@ -0,0 +1,169 @@
+#pragma once
+
+
+/* TS 29.118 Section 9.2 */
+enum sgsap_msg_type {
+ /* unassigned */
+ SGSAP_MSGT_PAGING_REQ = 0x01,
+ SGSAP_MSGT_PAGING_REJ = 0x02,
+ /* unassigned */
+ SGSAP_MSGT_SERVICE_REQ = 0x06,
+ SGSAP_MSGT_DL_UD = 0x07,
+ SGSAP_MSGT_UL_UD = 0x08,
+ SGSAP_MSGT_LOC_UPD_REQ = 0x09,
+ SGSAP_MSGT_LOC_UPD_ACK = 0x0a,
+ SGSAP_MSGT_LOC_UPD_REJ = 0x0b,
+ SGSAP_MSGT_TMSI_REALL_CMPL = 0x0c,
+ SGSAP_MSGT_ALERT_REQ = 0x0d,
+ SGSAP_MSGT_ALERT_ACK = 0x0e,
+ SGSAP_MSGT_ALERT_REJ = 0x0f,
+ SGSAP_MSGT_UE_ACT_IND = 0x10,
+ SGSAP_MSGT_EPS_DET_IND = 0x11,
+ SGSAP_MSGT_EPS_DET_ACK = 0x12,
+ SGSAP_MSGT_IMSI_DET_IND = 0x13,
+ SGSAP_MSGT_IMSI_DET_ACK = 0x14,
+ SGSAP_MSGT_RESET_IND = 0x15,
+ SGSAP_MSGT_RESET_ACK = 0x16,
+ SGSAP_MSGT_SERVICE_ABORT_REQ = 0x17,
+ SGSAP_MSGT_MO_CSFB_IND = 0x18,
+ /* unassigned */
+ SGSAP_MSGT_MM_INFO_REQ = 0x1a,
+ SGSAP_MSGT_RELEASE_REQ = 0x1b,
+ /* unassigned */
+ SGSAP_MSGT_STATUS = 0x1d,
+ /* unassigned */
+ SGSAP_MSGT_UE_UNREACHABLE = 0x1f,
+};
+const struct value_string sgsap_msg_type_names[];
+static inline const char *sgsap_msg_type_name(enum sgsap_msg_type msgt) {
+ return get_value_string(sgsap_msg_type_names, msgt);
+}
+
+/* TS 29.118 Section 9.3 */
+enum sgsap_iei {
+ SGSAP_IE_IMSI = 0x01,
+ SGSAP_IE_VLR_NAME = 0x02,
+ SGSAP_IE_TMSI = 0x03,
+ SGSAP_IE_LAI = 0x04,
+ SGSAP_IE_CHAN_NEEDED = 0x05,
+ SGSAP_IE_EMLPP_PRIORITY = 0x06,
+ SGSAP_IE_TMSI_STATUS = 0x07,
+ SGSAP_IE_SGS_CAUSE = 0x08,
+ SGSAP_IE_MME_NAME = 0x09,
+ SGSAP_IE_EPS_LU_TYPE = 0x0a,
+ SGSAP_IE_GLOBAL_CN_ID = 0x0b,
+ SGSAP_IE_MOBILE_ID = 0x0e,
+ SGSAP_IE_REJECT_CAUSE = 0x0f,
+ SGSAP_IE_IMSI_DET_EPS_TYPE = 0x10,
+ SGSAP_IE_IMSI_DET_NONEPS_TYPE = 0x11,
+ SGSAP_IE_IMEISV = 0x15,
+ SGSAP_IE_NAS_MSG_CONTAINER = 0x16,
+ SGSAP_IE_MM_INFO = 0x17,
+ SGSAP_IE_ERR_MSG = 0x1b,
+ SGSAP_IE_CLI = 0x1c,
+ SGSAP_IE_LCS_CLIENT_ID = 0x1d,
+ SGSAP_IE_LCS_INDICATOR = 0x1e,
+ SGSAP_IE_SS_CODE = 0x1f,
+ SGSAP_IE_SERVICE_INDICATOR = 0x20,
+ SGSAP_IE_UE_TIMEZONE = 0x21,
+ SGSAP_IE_MS_CLASSMARK2 = 0x22,
+ SGSAP_IE_TAI = 0x23,
+ SGSAP_IE_EUTRAN_CGI = 0x24,
+ SGSAP_IE_UE_EMM_MODE = 0x25,
+ SGSAP_IE_ADDL_PAGING_INDICATORS = 0x26,
+ SGSAP_IE_TMSI_BASED_NRI_CONT = 0x27,
+};
+
+
+/* TS 29.118 Section 9.4.2 */
+enum sgsap_eps_lu_type {
+ SGSAP_EPS_LUT_IMSI_ATTACH = 0x01,
+ SGSAP_EPS_LUT_NORMAL = 0x02,
+};
+const struct value_string sgsap_eps_lu_type_names[];
+static inline const char *sgsap_eps_lu_type_name(enum sgsap_eps_lu_type lut) {
+ return get_value_string(sgsap_eps_lu_type_names, lut);
+}
+
+/* TS 29.118 Section 9.4.7 */
+enum sgsap_imsi_det_eps_type {
+ SGSAP_ID_EPS_T_NETWORK_INITIATED = 0x01,
+ SGSAP_ID_EPS_T_UE_INITIATED = 0x02,
+ SGSAP_ID_EPS_T_EPS_NOT_ALLOWED = 0x03,
+};
+const struct value_string sgsap_ismi_det_eps_type_names[];
+static inline const char *sgsap_imsi_det_eps_type_name(enum sgsap_imsi_det_eps_type idt) {
+ return get_value_string(sgsap_ismi_det_eps_type_names, idt);
+}
+
+/* TS 29.118 Section 9.4.8 */
+enum sgsap_imsi_det_noneps_type {
+ SGSAP_ID_NONEPS_T_EXPLICIT_UE_NONEPS = 0x01,
+ SGSAP_ID_NONEPS_T_COMBINED_UE_EPS_NONEPS = 0x02,
+ SGSAP_ID_NONEPS_T_IMPLICIT_UE_EPS_NONEPS = 0x03,
+};
+const struct value_string sgsap_ismi_det_noneps_type_names[];
+static inline const char *sgsap_imsi_det_noneps_type_name(enum sgsap_imsi_det_noneps_type idt) {
+ return get_value_string(sgsap_ismi_det_noneps_type_names, idt);
+}
+
+/* TS 29.118 Section 9.4.17 */
+enum sgsap_service_ind {
+ SGSAP_SERV_IND_CS_CALL = 0x01,
+ SGSAP_SERV_IND_SMS = 0x02,
+};
+const struct value_string sgsap_service_ind_names[];
+static inline const char *sgsap_service_ind_name(enum sgsap_service_ind si) {
+ return get_value_string(sgsap_service_ind_names, si);
+}
+
+/* TS 29.118 Section 9.4.18 */
+enum sgsap_sgs_cause {
+ SGSAP_SGS_CAUSE_IMSI_DET_EPS = 0x01,
+ SGSAP_SGS_CAUSE_IMSI_DET_EPS_NONEPS = 0x02,
+ SGSAP_SGS_CAUSE_IMSI_UNKNOWN = 0x03,
+ SGSAP_SGS_CAUSE_IMSI_DET_NON_EPS = 0x04,
+ SGSAP_SGS_CAUSE_IMSI_IMPL_DET_NON_EPS = 0x05,
+ SGSAP_SGS_CAUSE_UE_UNREACHABLE = 0x06,
+ SGSAP_SGS_CAUSE_MSG_INCOMP_STATE = 0x07,
+ SGSAP_SGS_CAUSE_MISSING_MAND_IE = 0x08,
+ SGSAP_SGS_CAUSE_INVALID_MAND_IE = 0x09,
+ SGSAP_SGS_CAUSE_COND_IE_ERROR = 0x0a,
+ SGSAP_SGS_CAUSE_SEMANT_INCORR_MSG = 0x0b,
+ SGSAP_SGS_CAUSE_MSG_UNKNOWN = 0x0c,
+ SGSAP_SGS_CAUSE_MT_CSFB_REJ_USER = 0x0d,
+ SGSAP_SGS_CAUSE_UE_TEMP_UNREACHABLE = 0x0e,
+};
+const struct value_string sgsap_sgs_cause_names[];
+static inline const char *sgsap_sgs_cause_name(enum sgsap_sgs_cause cause) {
+ return get_value_string(sgsap_sgs_cause_names, cause);
+}
+
+/* TS 29.118 Section 9.4.21c */
+enum sgsap_ue_emm_mode {
+ SGSAP_UE_EMM_MODE_IDLE = 0x00,
+ SGSAP_UE_EMM_MODE_CONNECTED = 0x01,
+};
+const struct value_string sgsap_ue_emm_mode_names[];
+static inline const char *sgsap_ue_emm_mode_name(enum sgsap_ue_emm_mode mode) {
+ return get_value_string(sgsap_ue_emm_mode_names, mode);
+}
+
+/* TS 29.118 Section 10.1 Table 10.1.2 */
+#define SGS_TS5_DEFAULT 10 /* Guards the Paging Procedure at the VLR */
+#define SGS_TS6_2_DEFAULT 40 /* Guards the TMSI reallocation procedure */
+#define SGS_TS7_DEFAULT 4 /* Guards the non-EPS alert procedure */
+#define SGS_TS11_DEFAULT 4 /* Guards the VLR reset procedure */
+#define SGS_TS14_DEFAULT 10 /* Guards the UE fallback to UTRAN/GERAN */
+#define SGS_TS15_DEFAULT 10 /* Guards the MO UE fallback to UTRAN/GERAN */
+
+/* TS 29.118 Section 10.2 Table 10.2.1 */
+#define SGS_NS7_DEFAULT 2
+#define SGS_NS11_DEFAULT 2
+/* TS 29.118 Section 10.2 Table 10.2.2 */
+#define SGS_NS8_DEFAULT 2
+#define SGS_NS9_DEFAULT 2
+#define SGS_NS10_DEFAULT 2
+#define SGS_NS12_DEFAULT 2
+
+const struct tlv_definition sgsap_ie_tlvdef;
diff --git a/src/gsm/Makefile.am b/src/gsm/Makefile.am
index 29299a64..e28ea335 100644
--- a/src/gsm/Makefile.am
+++ b/src/gsm/Makefile.am
@@ -30,7 +30,8 @@ libgsmint_la_SOURCES = a5.c rxlev_stat.c tlv_parser.c comp128.c comp128v23.c \
milenage/aes-internal.c milenage/aes-internal-enc.c \
milenage/milenage.c gan.c ipa.c gsm0341.c apn.c \
gsup.c gprs_gea.c gsm0503_conv.c oap.c gsm0808_utils.c \
- gsm23003.c mncc.c bts_features.c oap_client.c
+ gsm23003.c mncc.c bts_features.c oap_client.c \
+ gsm29118.c
libgsmint_la_LDFLAGS = -no-undefined
libgsmint_la_LIBADD = $(top_builddir)/src/libosmocore.la
diff --git a/src/gsm/gsm29118.c b/src/gsm/gsm29118.c
new file mode 100644
index 00000000..de625a90
--- /dev/null
+++ b/src/gsm/gsm29118.c
@@ -0,0 +1,123 @@
+#include <osmocom/core/utils.h>
+#include <osmocom/gsm/tlv.h>
+
+#include <osmocom/gsm/protocol/gsm_29_118.h>
+
+const struct value_string sgsap_msg_type_names[] = {
+ { SGSAP_MSGT_PAGING_REQ, "PAGING-REQUEST" },
+ { SGSAP_MSGT_PAGING_REJ, "PAGING-REJECT" },
+ { SGSAP_MSGT_SERVICE_REQ, "SERVICE-REQUEST" },
+ { SGSAP_MSGT_DL_UD, "DOWNLINK-UNITDATA" },
+ { SGSAP_MSGT_UL_UD, "UPLINK-UNITDATA" },
+ { SGSAP_MSGT_LOC_UPD_REQ, "LOCATION-UPDATE-REQUEST" },
+ { SGSAP_MSGT_LOC_UPD_ACK, "LOCATION-UPDATE-ACCEPT" },
+ { SGSAP_MSGT_LOC_UPD_REJ, "LOCATION-UPDATE-REJECT" },
+ { SGSAP_MSGT_TMSI_REALL_CMPL, "TMSI-REALLOCATION-COMPLETE" },
+ { SGSAP_MSGT_ALERT_REQ, "ALERT-REQQUEST" },
+ { SGSAP_MSGT_ALERT_ACK, "ALERT-ACK" },
+ { SGSAP_MSGT_ALERT_REJ, "ALERT-REJECT" },
+ { SGSAP_MSGT_UE_ACT_IND, "UE-ACTIVITY-INDICATION" },
+ { SGSAP_MSGT_EPS_DET_IND, "EPS-DETACH-INDICATION" },
+ { SGSAP_MSGT_EPS_DET_ACK, "EPS-DETACH-ACK" },
+ { SGSAP_MSGT_IMSI_DET_IND, "IMSI-DETACH-INDICATION" },
+ { SGSAP_MSGT_IMSI_DET_ACK, "IMSI-DETACH-ACK" },
+ { SGSAP_MSGT_RESET_IND, "RESET-INDICATION" },
+ { SGSAP_MSGT_RESET_ACK, "RESET-ACK" },
+ { SGSAP_MSGT_SERVICE_ABORT_REQ, "SERVICE-ABORT-REQUEST" },
+ { SGSAP_MSGT_MO_CSFB_IND, "MO-CSFB-INDICATION" },
+ { SGSAP_MSGT_MM_INFO_REQ, "MM-INFO-REQUEST" },
+ { SGSAP_MSGT_RELEASE_REQ, "RELEASE-REQUEST" },
+ { SGSAP_MSGT_STATUS, "STATUS" },
+ { SGSAP_MSGT_UE_UNREACHABLE, "UE-UNREACHABLE" },
+ { 0, NULL }
+};
+
+const struct value_string sgsap_eps_lu_type_names[] = {
+ { SGSAP_EPS_LUT_IMSI_ATTACH, "IMSI Attach" },
+ { SGSAP_EPS_LUT_NORMAL, "Normal" },
+ { 0, NULL }
+};
+
+const struct value_string sgsap_ismi_det_eps_type_names[] = {
+ { SGSAP_ID_EPS_T_NETWORK_INITIATED, "Network initiated IMSI detach from EPS" },
+ { SGSAP_ID_EPS_T_UE_INITIATED, "UE initiated IMSI detach from EPS" },
+ { SGSAP_ID_EPS_T_EPS_NOT_ALLOWED, "EPS not allowed" },
+ { 0, NULL }
+};
+
+const struct value_string sgsap_ismi_det_noneps_type_names[] = {
+ { SGSAP_ID_NONEPS_T_EXPLICIT_UE_NONEPS,
+ "Explicit UE initiated IMSI detach from non-EPS" },
+ { SGSAP_ID_NONEPS_T_COMBINED_UE_EPS_NONEPS,
+ "Combined UE initiated IMSI detach from EPS and non-EPS" },
+ { SGSAP_ID_NONEPS_T_IMPLICIT_UE_EPS_NONEPS,
+ "Implicit network initiated IMSI detach from EPS and non-EPS" },
+ { 0, NULL }
+};
+
+const struct value_string sgsap_service_ind_names[] = {
+ { SGSAP_SERV_IND_CS_CALL, "CS Call" },
+ { SGSAP_SERV_IND_SMS, "SMS" },
+ { 0, NULL }
+};
+
+const struct value_string sgsap_sgs_cause_names[] = {
+ { SGSAP_SGS_CAUSE_IMSI_DET_EPS, "IMSI detached for EPS" },
+ { SGSAP_SGS_CAUSE_IMSI_DET_EPS_NONEPS, "IMSI detached for EPS and non-EPS" },
+ { SGSAP_SGS_CAUSE_IMSI_UNKNOWN, "IMSI unknown" },
+ { SGSAP_SGS_CAUSE_IMSI_DET_NON_EPS, "IMSI detached for non-EPS" },
+ { SGSAP_SGS_CAUSE_IMSI_IMPL_DET_NON_EPS,"IMSI implicitly detached for non-EPS" },
+ { SGSAP_SGS_CAUSE_UE_UNREACHABLE, "UE unreachable" },
+ { SGSAP_SGS_CAUSE_MSG_INCOMP_STATE, "Message not compatible with protocol state" },
+ { SGSAP_SGS_CAUSE_MISSING_MAND_IE, "Missing mandatory IE" },
+ { SGSAP_SGS_CAUSE_INVALID_MAND_IE, "Invalid mandatory IE" },
+ { SGSAP_SGS_CAUSE_COND_IE_ERROR, "Conditional IE error" },
+ { SGSAP_SGS_CAUSE_SEMANT_INCORR_MSG, "Semantically incorrect message" },
+ { SGSAP_SGS_CAUSE_MSG_UNKNOWN, "Message unknown" },
+ { SGSAP_SGS_CAUSE_MT_CSFB_REJ_USER, "MT CSFB call rejected by user" },
+ { SGSAP_SGS_CAUSE_UE_TEMP_UNREACHABLE, "UE temporarily unreachable" },
+ { 0, NULL }
+};
+
+
+const struct value_string sgsap_ue_emm_mode_names[] = {
+ { SGSAP_UE_EMM_MODE_IDLE, "EMM-IDLE" },
+ { SGSAP_UE_EMM_MODE_CONNECTED, "EMM-CONNECTED" },
+ { 0, NULL }
+};
+
+const struct tlv_definition sgsap_ie_tlvdef = {
+ .def = {
+ [SGSAP_IE_IMSI] = { TLV_TYPE_TLV },
+ [SGSAP_IE_VLR_NAME] = { TLV_TYPE_TLV },
+ [SGSAP_IE_TMSI] = { TLV_TYPE_TLV },
+ [SGSAP_IE_LAI] = { TLV_TYPE_TLV },
+ [SGSAP_IE_CHAN_NEEDED] = { TLV_TYPE_TLV },
+ [SGSAP_IE_EMLPP_PRIORITY] = { TLV_TYPE_TLV },
+ [SGSAP_IE_TMSI_STATUS] = { TLV_TYPE_TLV },
+ [SGSAP_IE_SGS_CAUSE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_MME_NAME] = { TLV_TYPE_TLV },
+ [SGSAP_IE_EPS_LU_TYPE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_GLOBAL_CN_ID] = { TLV_TYPE_TLV },
+ [SGSAP_IE_MOBILE_ID] = { TLV_TYPE_TLV },
+ [SGSAP_IE_REJECT_CAUSE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_IMSI_DET_EPS_TYPE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_IMSI_DET_NONEPS_TYPE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_IMEISV] = { TLV_TYPE_TLV },
+ [SGSAP_IE_NAS_MSG_CONTAINER] = { TLV_TYPE_TLV },
+ [SGSAP_IE_MM_INFO] = { TLV_TYPE_TLV },
+ [SGSAP_IE_ERR_MSG] = { TLV_TYPE_TLV },
+ [SGSAP_IE_CLI] = { TLV_TYPE_TLV },
+ [SGSAP_IE_LCS_CLIENT_ID] = { TLV_TYPE_TLV },
+ [SGSAP_IE_LCS_INDICATOR] = { TLV_TYPE_TLV },
+ [SGSAP_IE_SS_CODE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_SERVICE_INDICATOR] = { TLV_TYPE_TLV },
+ [SGSAP_IE_UE_TIMEZONE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_MS_CLASSMARK2] = { TLV_TYPE_TLV },
+ [SGSAP_IE_TAI] = { TLV_TYPE_TLV },
+ [SGSAP_IE_EUTRAN_CGI] = { TLV_TYPE_TLV },
+ [SGSAP_IE_UE_EMM_MODE] = { TLV_TYPE_TLV },
+ [SGSAP_IE_ADDL_PAGING_INDICATORS]={ TLV_TYPE_TLV },
+ [SGSAP_IE_TMSI_BASED_NRI_CONT] = { TLV_TYPE_TLV },
+ },
+};
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index dcc491d7..3cc2ec5f 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -505,5 +505,14 @@ osmo_oap_client_handle;
osmo_oap_client_init;
osmo_oap_client_register;
+sgsap_msg_type_names;
+sgsap_eps_lu_type_names;
+sgsap_ismi_det_eps_type_names;
+sgsap_ismi_det_noneps_type_names;
+sgsap_service_ind_names;
+sgsap_sgs_cause_names;
+sgsap_ue_emm_mode_names;
+sgsap_ie_tlvdef;
+
local: *;
};