ipse has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bsc/+/18232 )
Change subject: bssap: Handle BSSMAP CONFUSION message.
..
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.
Change-Id: Ib4cd94f185f751b238484678ff671ac413c4
---
M include/osmocom/bsc/bsc_msc_data.h
M src/osmo-bsc/osmo_bsc_bssap.c
M src/osmo-bsc/osmo_bsc_msc.c
3 files changed, 66 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/32/18232/1
diff --git a/include/osmocom/bsc/bsc_msc_data.h
b/include/osmocom/bsc/bsc_msc_data.h
index 74a6f3c..fc816b4 100644
--- a/include/osmocom/bsc/bsc_msc_data.h
+++ b/include/osmocom/bsc/bsc_msc_data.h
@@ -69,6 +69,7 @@
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 6f5aaa8..edc313b 100644
--- a/src/osmo-bsc/osmo_bsc_bssap.c
+++ b/src/osmo-bsc/osmo_bsc_bssap.c
@@ -1006,6 +1006,66 @@
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 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 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);
+ LOGPFSML(conn->fi, LOGL_ERROR,
+"Received Confusion message: Cause %d/0x%x (%s)",
+cause, cause, gsm0808_cause_name(cause));
+ LOGPFSML(conn->fi, LOGL_ERROR,
+"Received Confusion message: Cause class %d/0x%x (%s)",
+cause_class, cause_class,
gsm0808_cause_class_name(cause_class));
+
+ diag = (struct gsm0808_diagnostics *)TLVP_VAL(&tp,
GSM0808_IE_DIAGNOSTIC);
+ /* octet location */
+ LOGPFSML(conn->fi, LOGL_ERROR,
+" Confusion Diagnostics error octet location %d (%s)\n",
+diag->error_pointer_octet,
+
gsm0808_diagnostics_octet_location_str(diag->error_pointer_octet));
+ /* bit location */
+ LOGPFSML(conn->fi, LOGL_ERROR,
+" Confusion Diagnostics error bit location: %d (%s)\n",
+diag->error_pointer_bit,
+gsm0808_diagnostics_bit_location_str(diag->error_pointer_bit));
+ /* received message dump */
+ LOGPFSML(conn->fi, LOGL_ERROR,
+" Confusion Diagnostics message that provoked the error:
%s\n",
+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 +1142,10 @@
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 db3ffe4..e58ff7f 100644
--- a/src/osmo-bsc/osmo_bsc_msc.c
+++ b/src/osmo-bsc/osmo_bsc_msc.c
@@ -55,6 +55,7 @@
[MSC_CTR_BSSMAP_RX_DT1_LCLS_CONNECT_CTRL] =
{"bssmap:rx:dt1:lcls_connect_ctrl: