aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bsc
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-02-12 16:37:56 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2020-02-12 16:38:12 +0100
commit8ada9207796e8c34c4295aadc43120dff037d010 (patch)
treecc9e4db0ba7725ea58eaba02eba0a9e865fedac4 /src/osmo-bsc
parent2fa9763fb8ad3bf8fdf6b235f601a8b16cd6f8f9 (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
Diffstat (limited to 'src/osmo-bsc')
-rw-r--r--src/osmo-bsc/osmo_bsc_bssap.c26
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);