aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Chemeris <Alexander.Chemeris@gmail.com>2020-05-13 00:47:03 +0300
committerlaforge <laforge@osmocom.org>2020-05-19 20:00:32 +0000
commit3a656da1c685afe64fe54ee9fb9c9dc344ab899f (patch)
treed3a3e925abb4239e71e5853223dd339bc623ac35
parenta3af93acc4681f6090d8562d3f2a89fdd0daa301 (diff)
bssap: Handle BSSMAP CONFUSION message.
We decode the mesage and print it to the log files at ERROR log level. We also count it in the BSSMAP message counters. There is not much else we could do about it. Depends: If8afd2d096fb66c6c2f255a08fc1129de3d09cec (libosmocore) Change-Id: Ib4cd94f185f751b2384842222678ff671ac413c4
-rw-r--r--TODO-RELEASE3
-rw-r--r--include/osmocom/bsc/bsc_msc_data.h1
-rw-r--r--src/osmo-bsc/osmo_bsc_bssap.c54
-rw-r--r--src/osmo-bsc/osmo_bsc_msc.c1
4 files changed, 59 insertions, 0 deletions
diff --git a/TODO-RELEASE b/TODO-RELEASE
index dde4b72f2..e2fa427b3 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -8,3 +8,6 @@
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
manual needs common chapter cs7-config.adoc from osmo-gsm-manuals > 0.3.0
+libosmocore struct gsm0808_diagnostics Depends on libosmocore > 1.3.0
+libosmocore gsm0808_diagnostics_octet_location_str() Depends on libosmocore > 1.3.0
+libosmocore gsm0808_diagnostics_bit_location_str() Depends on libosmocore > 1.3.0
diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h
index 74a6f3ce2..fc816b4fd 100644
--- a/include/osmocom/bsc/bsc_msc_data.h
+++ b/include/osmocom/bsc/bsc_msc_data.h
@@ -69,6 +69,7 @@ enum {
MSC_CTR_BSSMAP_RX_DT1_LCLS_CONNECT_CTRL,
MSC_CTR_BSSMAP_RX_DT1_HANDOVER_CMD,
MSC_CTR_BSSMAP_RX_DT1_CLASSMARK_RQST,
+ MSC_CTR_BSSMAP_RX_DT1_CONFUSION,
MSC_CTR_BSSMAP_RX_DT1_UNKNOWN,
MSC_CTR_BSSMAP_RX_DT1_DTAP,
MSC_CTR_BSSMAP_RX_DT1_DTAP_ERROR,
diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c
index ddebb6a7d..388ad14fc 100644
--- a/src/osmo-bsc/osmo_bsc_bssap.c
+++ b/src/osmo-bsc/osmo_bsc_bssap.c
@@ -1006,6 +1006,56 @@ reject:
return -EINVAL;
}
+/* Handle Confusion message, MSC indicating an error to us:
+ *
+ * See 3GPP TS 48.008 ยง3.2.1.45
+ */
+static int bssmap_handle_confusion(struct gsm_subscriber_connection *conn,
+ struct msgb *msg, unsigned int length)
+{
+ struct tlv_parsed tp;
+ int diag_len;
+ enum gsm0808_cause cause;
+ enum gsm0808_cause_class cause_class;
+ struct gsm0808_diagnostics *diag;
+
+ osmo_bssap_tlv_parse(&tp, msg->l4h + 1, length - 1);
+
+ /* Check for the Cause and Diagnostic mandatory elements */
+ if (!TLVP_PRESENT(&tp, GSM0808_IE_CAUSE) || !TLVP_PRESENT(&tp, GSM0808_IE_DIAGNOSTIC)) {
+ LOGPFSML(conn->fi, LOGL_ERROR,
+ "Received BSSMAP Confusion message,"
+ " but either Cause or Diagnostic mandatory IE is not present: %s\n",
+ osmo_hexdump(msg->l4h, length));
+ return -EINVAL;
+ }
+
+ diag_len = TLVP_LEN(&tp, GSM0808_IE_DIAGNOSTIC);
+ if (diag_len < 5) {
+ LOGPFSML(conn->fi, LOGL_ERROR,
+ "Received BSSMAP Confusion message with short Diagnostic length: %d (expected > 5)\n",
+ diag_len);
+ return -EINVAL;
+ }
+
+ cause = gsm0808_get_cause(&tp);
+ cause_class = gsm0808_cause_class(cause);
+ diag = (struct gsm0808_diagnostics *)TLVP_VAL(&tp, GSM0808_IE_DIAGNOSTIC);
+
+ LOGPFSML(conn->fi, LOGL_ERROR,
+ "Received BSSMAP Confusion: class 0x%x (%s), cause 0x%x (%s), "
+ "error octet %d (%s), error bit %d (%s), original message: %s\n",
+ cause_class, gsm0808_cause_class_name(cause_class),
+ cause, gsm0808_cause_name(cause),
+ diag->error_pointer_octet,
+ gsm0808_diagnostics_octet_location_str(diag->error_pointer_octet),
+ diag->error_pointer_bit,
+ gsm0808_diagnostics_bit_location_str(diag->error_pointer_bit),
+ osmo_hexdump(diag->msg, diag_len-2));
+
+ return 0;
+}
+
static int bssmap_rcvmsg_udt(struct bsc_msc_data *msc,
struct msgb *msg, unsigned int length)
{
@@ -1082,6 +1132,10 @@ static int bssmap_rcvmsg_dt1(struct gsm_subscriber_connection *conn,
rate_ctr_inc(&ctrs[MSC_CTR_BSSMAP_RX_DT1_CLASSMARK_RQST]);
ret = gsm48_send_rr_classmark_enquiry(conn->lchan);
break;
+ case BSS_MAP_MSG_CONFUSION:
+ rate_ctr_inc(&ctrs[MSC_CTR_BSSMAP_RX_DT1_CONFUSION]);
+ ret = bssmap_handle_confusion(conn, msg, length);
+ break;
default:
rate_ctr_inc(&ctrs[MSC_CTR_BSSMAP_RX_DT1_UNKNOWN]);
LOGP(DMSC, LOGL_NOTICE, "Unimplemented msg type: %s\n",
diff --git a/src/osmo-bsc/osmo_bsc_msc.c b/src/osmo-bsc/osmo_bsc_msc.c
index db3ffe4e7..e58ff7faf 100644
--- a/src/osmo-bsc/osmo_bsc_msc.c
+++ b/src/osmo-bsc/osmo_bsc_msc.c
@@ -55,6 +55,7 @@ static const struct rate_ctr_desc msc_ctr_description[] = {
[MSC_CTR_BSSMAP_RX_DT1_LCLS_CONNECT_CTRL] = {"bssmap:rx:dt1:lcls_connect_ctrl:cmd", "Number of received BSSMAP DT1 LCLS CONNECT CTRL messages"},
[MSC_CTR_BSSMAP_RX_DT1_HANDOVER_CMD] = {"bssmap:rx:dt1:handover:cmd", "Number of received BSSMAP DT1 HANDOVER CMD messages"},
[MSC_CTR_BSSMAP_RX_DT1_CLASSMARK_RQST] = {"bssmap:rx:dt1:classmark:rqst", "Number of received BSSMAP DT1 CLASSMARK RQST messages"},
+ [MSC_CTR_BSSMAP_RX_DT1_CONFUSION] = {"bssmap:rx:dt1:confusion", "Number of received BSSMAP DT1 CONFUSION messages"},
[MSC_CTR_BSSMAP_RX_DT1_UNKNOWN] = {"bssmap:rx:dt1:err_unknown", "Number of received BSSMAP unknown DT1 messages"},
[MSC_CTR_BSSMAP_RX_DT1_DTAP] = {"bssmap:rx:dt1:dtap:good", "Number of received BSSMAP DTAP messages"},
[MSC_CTR_BSSMAP_RX_DT1_DTAP_ERROR] = {"bssmap:rx:dt1:dtap:error", "Number of received BSSMAP DTAP messages with errors"},