diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-12-26 01:46:45 +0100 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2018-12-26 01:46:45 +0100 |
commit | 6131712c6819b30a39a028ead86f8fa10f4e21b4 (patch) | |
tree | a5a70ac61f61e1262c6e150b97e4907b71a443ea | |
parent | 07b98dc34c87bc23e6692e4d00b8dec94ae86632 (diff) |
Change-Id: If4df92abd5f98c388a51f085a24bbc1928f721ca
-rw-r--r-- | include/osmocom/gsm/gsm_utils.h | 13 | ||||
-rw-r--r-- | include/osmocom/gsm/gsup.h | 5 | ||||
-rw-r--r-- | src/gsm/gsm_utils.c | 8 | ||||
-rw-r--r-- | src/gsm/gsup.c | 24 | ||||
-rw-r--r-- | src/gsm/libosmogsm.map | 2 | ||||
-rw-r--r-- | tests/gsup/gsup_test.err | 14 |
6 files changed, 59 insertions, 7 deletions
diff --git a/include/osmocom/gsm/gsm_utils.h b/include/osmocom/gsm/gsm_utils.h index fe5903db..095ac41a 100644 --- a/include/osmocom/gsm/gsm_utils.h +++ b/include/osmocom/gsm/gsm_utils.h @@ -241,3 +241,16 @@ int gsm_7bit_decode_ussd(char *decoded, const uint8_t *user_data, uint8_t length int gsm_7bit_encode(uint8_t *result, const char *data) OSMO_DEPRECATED("Use gsm_7bit_encode_n() instead"); int gsm_7bit_encode_ussd(uint8_t *result, const char *data, int *octets_written) OSMO_DEPRECATED("Use gsm_7bit_encode_n_ussd() instead"); int gsm_7bit_encode_oct(uint8_t *result, const char *data, int *octets_written) OSMO_DEPRECATED("Use gsm_7bit_encode_n() instead"); + +enum osmo_rat_type { + OSMO_RAT_UNKNOWN = 0, + OSMO_RAT_GERAN_A, + OSMO_RAT_UTRAN_IU, + + /* keep this last */ + OSMO_RAT_COUNT +}; + +extern const struct value_string osmo_rat_type_names[]; +inline static const char *osmo_rat_type_name(enum osmo_rat_type val) +{ return get_value_string(osmo_rat_type_names, val); } diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h index 6adb0bfd..8384e241 100644 --- a/include/osmocom/gsm/gsup.h +++ b/include/osmocom/gsm/gsup.h @@ -43,6 +43,7 @@ #include <osmocom/gsm/gsup_sms.h> #include <osmocom/gsm/protocol/gsm_23_003.h> #include <osmocom/gsm/protocol/gsm_04_08_gprs.h> +#include <osmocom/gsm/gsm_utils.h> #include <osmocom/crypt/auth.h> #define OSMO_GSUP_PORT 4222 @@ -83,6 +84,7 @@ enum osmo_gsup_iei { OSMO_GSUP_AUTS_IE = 0x26, OSMO_GSUP_RES_IE = 0x27, OSMO_GSUP_CN_DOMAIN_IE = 0x28, + OSMO_GSUP_RAT_TYPES_IE = 0x29, OSMO_GSUP_SESSION_ID_IE = 0x30, OSMO_GSUP_SESSION_STATE_IE = 0x31, @@ -275,6 +277,9 @@ struct osmo_gsup_message { const uint8_t *imei_enc; size_t imei_enc_len; enum osmo_gsup_imei_result imei_result; + + enum osmo_rat_type rat_types[8]; + size_t rat_types_len; }; int osmo_gsup_decode(const uint8_t *data, size_t data_len, diff --git a/src/gsm/gsm_utils.c b/src/gsm/gsm_utils.c index 8b4b5586..32fb6257 100644 --- a/src/gsm/gsm_utils.c +++ b/src/gsm/gsm_utils.c @@ -997,3 +997,11 @@ int gsm_7bit_encode_oct(uint8_t *result, const char *data, int *octets) return gsm_7bit_encode_n(result, GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, data, octets); } + +/* This is also used by osmo-hlr's db schema */ +const struct value_string osmo_rat_type_names[] = { + { OSMO_RAT_UNKNOWN, "unknown" }, + { OSMO_RAT_GERAN_A, "GERAN-A" }, + { OSMO_RAT_UTRAN_IU, "UTRAN-Iu"}, + {} +}; diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c index 3d2a8e2e..6ca3100b 100644 --- a/src/gsm/gsup.c +++ b/src/gsm/gsup.c @@ -282,6 +282,7 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len, struct osmo_gsup_message *gsup_msg) { int rc; + int i; uint8_t tag; /* the shift/match functions expect non-const pointers, but we'll * either copy the data or cast pointers back to const before returning @@ -442,6 +443,15 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len, gsup_msg->cn_domain = *value; break; + case OSMO_GSUP_RAT_TYPES_IE: + if (value_len > ARRAY_SIZE(gsup_msg->rat_types)) { + LOGP(DLGSUP, LOGL_ERROR, "nr of RAT types %zu > %zu\n", value_len, ARRAY_SIZE(gsup_msg->rat_types)); + return -GMM_CAUSE_COND_IE_ERR; + } + for (i = 0; i < value_len; i++) + gsup_msg->rat_types[i] = value[i]; + break; + case OSMO_GSUP_CHARG_CHAR_IE: gsup_msg->pdp_charg_enc = value; gsup_msg->pdp_charg_enc_len = value_len; @@ -676,6 +686,20 @@ int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg) msgb_tlv_put(msg, OSMO_GSUP_CN_DOMAIN_IE, 1, &dn); } + if (gsup_msg->rat_types_len) { + int i; + uint8_t *len = msgb_tl_put(msg, OSMO_GSUP_RAT_TYPES_IE); + *len = gsup_msg->rat_types_len; + for (i = 0; i < gsup_msg->rat_types_len; i++) { + if (!gsup_msg->rat_types[i] || gsup_msg->rat_types[i] >= OSMO_RAT_COUNT) { + LOGP(DLGSUP, LOGL_ERROR, "Failed to encode RAT type %s (nr %d)\n", + osmo_rat_type_name(gsup_msg->rat_types[i]), i); + return -EINVAL; + } + msgb_v_put(msg, gsup_msg->rat_types[i]); + } + } + if (gsup_msg->pdp_charg_enc) { msgb_tlv_put(msg, OSMO_GSUP_CHARG_CHAR_IE, gsup_msg->pdp_charg_enc_len, gsup_msg->pdp_charg_enc); diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index 90c21954..cdc74dac 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -553,5 +553,7 @@ sgsap_sgs_cause_names; sgsap_ue_emm_mode_names; sgsap_ie_tlvdef; +osmo_rat_type_names; + local: *; }; diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err index 73b35fc5..ea6fa150 100644 --- a/tests/gsup/gsup_test.err +++ b/tests/gsup/gsup_test.err @@ -101,26 +101,26 @@ DLGSUP Stopping DLGSUP logging message 0: tested 2816 modifications, 510 parse failures message 1: tested 3584 modifications, 770 parse failures - message 2: tested 21248 modifications, 2575 parse failures + message 2: tested 21248 modifications, 2577 parse failures message 3: tested 2816 modifications, 510 parse failures message 4: tested 3584 modifications, 770 parse failures - message 5: tested 20736 modifications, 4022 parse failures + message 5: tested 20736 modifications, 4024 parse failures message 6: tested 3584 modifications, 771 parse failures message 7: tested 3584 modifications, 770 parse failures message 8: tested 2816 modifications, 510 parse failures message 9: tested 2816 modifications, 510 parse failures message 10: tested 3584 modifications, 770 parse failures message 11: tested 3328 modifications, 769 parse failures - message 12: tested 54016 modifications, 4626 parse failures - message 13: tested 11520 modifications, 1026 parse failures + message 12: tested 54016 modifications, 4628 parse failures + message 13: tested 11520 modifications, 1028 parse failures message 14: tested 5120 modifications, 1030 parse failures - message 15: tested 10752 modifications, 1262 parse failures + message 15: tested 10752 modifications, 1263 parse failures message 16: tested 7680 modifications, 1271 parse failures message 17: tested 8448 modifications, 2053 parse failures - message 18: tested 11264 modifications, 2307 parse failures + message 18: tested 11264 modifications, 2308 parse failures message 19: tested 5120 modifications, 1031 parse failures message 20: tested 6656 modifications, 1546 parse failures message 21: tested 3584 modifications, 771 parse failures - message 22: tested 5632 modifications, 771 parse failures + message 22: tested 5632 modifications, 772 parse failures message 23: tested 3584 modifications, 770 parse failures message 24: tested 3584 modifications, 771 parse failures |