diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-02-12 16:37:56 +0100 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-02-12 16:38:12 +0100 |
commit | 8ada9207796e8c34c4295aadc43120dff037d010 (patch) | |
tree | cc9e4db0ba7725ea58eaba02eba0a9e865fedac4 | |
parent | 2fa9763fb8ad3bf8fdf6b235f601a8b16cd6f8f9 (diff) |
bssap: Avoid logging error if no optional Global Call Ref IE received
Also take the chance to simplify related code and print erroneous IE
data.
Change-Id: I27ee9c6112f96d6839b8b6141888ac8fe377db65
-rw-r--r-- | src/osmo-bsc/osmo_bsc_bssap.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c index 74faae1bc..1ba490faa 100644 --- a/src/osmo-bsc/osmo_bsc_bssap.c +++ b/src/osmo-bsc/osmo_bsc_bssap.c @@ -568,20 +568,24 @@ reject: static void bssmap_handle_ass_req_lcls(struct gsm_subscriber_connection *conn, const struct tlv_parsed *tp) { - const uint8_t *config, *control, *gcr, gcr_len = TLVP_LEN(tp, GSM0808_IE_GLOBAL_CALL_REF); - - if (gcr_len > sizeof(conn->lcls.global_call_ref)) - LOGPFSML(conn->fi, LOGL_ERROR, "Global Call Ref IE of %u bytes is too long\n", - gcr_len); - else { - gcr = TLVP_VAL_MINLEN(tp, GSM0808_IE_GLOBAL_CALL_REF, 13); - if (gcr) { + const uint8_t *config, *control, *gcr; + uint8_t gcr_len; + + /* TS 48.008 sec 3.2.2.115 Global Call Reference */ + if (TLVP_PRESENT(tp, GSM0808_IE_GLOBAL_CALL_REF)) { + gcr = TLVP_VAL(tp, GSM0808_IE_GLOBAL_CALL_REF); + gcr_len = TLVP_LEN(tp, GSM0808_IE_GLOBAL_CALL_REF); + if (gcr_len > sizeof(conn->lcls.global_call_ref)) { + LOGPFSML(conn->fi, LOGL_ERROR, "Global Call Ref IE of %u bytes is too long: %s\n", + gcr_len, osmo_hexdump_nospc(gcr, gcr_len)); + } else if (gcr_len < 13) { /* FIXME: document this magic value 13 */ + LOGPFSML(conn->fi, LOGL_ERROR, "Global Call Ref IE of %u bytes is too short: %s\n", + gcr_len, osmo_hexdump_nospc(gcr, gcr_len)); + } else { LOGPFSM(conn->fi, "Setting GCR to %s\n", osmo_hexdump_nospc(gcr, gcr_len)); memcpy(&conn->lcls.global_call_ref, gcr, gcr_len); conn->lcls.global_call_ref_len = gcr_len; - } else - LOGPFSML(conn->fi, LOGL_ERROR, "Global Call Ref IE of %u bytes is too short\n", - gcr_len); + } } config = TLVP_VAL_MINLEN(tp, GSM0808_IE_LCLS_CONFIG, 1); |