<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18942">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Implement support for receiving BSSMAP CommonID from MSC<br><br>The MSC may at any time send a BSSMAP CommonID message via a<br>SCCP connection to inform us of the IMSI of the subscriber.  Let's<br>make use of that information by associating a related bsc_subscr<br>and updating the identity of the bsc_subscr_conn_fsm for improved<br>logging / filtering.<br><br>Closes: OS#2969<br>Change-Id: I52c43fb940f0db796adf4c0adb2260321c721c39<br>---<br>M include/osmocom/bsc/bsc_msc_data.h<br>M include/osmocom/bsc/bsc_subscr_conn_fsm.h<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M src/osmo-bsc/osmo_bsc_msc.c<br>5 files changed, 55 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/42/18942/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>index b1fe14d..43ace25 100644</span><br><span>--- a/include/osmocom/bsc/bsc_msc_data.h</span><br><span>+++ b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>@@ -64,6 +64,7 @@</span><br><span>     MSC_CTR_BSSMAP_RX_DT1_HANDOVER_CMD,</span><br><span>  MSC_CTR_BSSMAP_RX_DT1_CLASSMARK_RQST,</span><br><span>        MSC_CTR_BSSMAP_RX_DT1_CONFUSION,</span><br><span style="color: hsl(120, 100%, 40%);">+      MSC_CTR_BSSMAP_RX_DT1_COMMON_ID,</span><br><span>     MSC_CTR_BSSMAP_RX_DT1_UNKNOWN,</span><br><span>       MSC_CTR_BSSMAP_RX_DT1_DTAP,</span><br><span>  MSC_CTR_BSSMAP_RX_DT1_DTAP_ERROR,</span><br><span>diff --git a/include/osmocom/bsc/bsc_subscr_conn_fsm.h b/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>index 5475272..1c88e42 100644</span><br><span>--- a/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>+++ b/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>@@ -12,6 +12,8 @@</span><br><span>       GSCON_EV_A_CLEAR_CMD,</span><br><span>        /* MSC SCCP disconnect indication */</span><br><span>         GSCON_EV_A_DISC_IND,</span><br><span style="color: hsl(120, 100%, 40%);">+  /* MSC has sent a BSSMAP COMMON ID */</span><br><span style="color: hsl(120, 100%, 40%);">+ GSCON_EV_A_COMMON_ID_IND,</span><br><span> </span><br><span>        GSCON_EV_ASSIGNMENT_START,</span><br><span>   GSCON_EV_ASSIGNMENT_END,</span><br><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index 1d30246..b723526 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -72,6 +72,7 @@</span><br><span>    {GSCON_EV_A_CONN_CFM, "MO-CONNECT.cfm"},</span><br><span>   {GSCON_EV_A_CLEAR_CMD, "CLEAR_CMD"},</span><br><span>       {GSCON_EV_A_DISC_IND, "DISCONNET.ind"},</span><br><span style="color: hsl(120, 100%, 40%);">+     {GSCON_EV_A_COMMON_ID_IND, "COMMON_ID.ind"},</span><br><span>       {GSCON_EV_ASSIGNMENT_START, "ASSIGNMENT_START"},</span><br><span>   {GSCON_EV_ASSIGNMENT_END, "ASSIGNMENT_END"},</span><br><span>       {GSCON_EV_HANDOVER_START, "HANDOVER_START"},</span><br><span>@@ -746,6 +747,7 @@</span><br><span> static void gscon_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>    struct gsm_subscriber_connection *conn = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_mobile_identity *mi_imsi;</span><br><span> </span><br><span>    /* Regular allstate event processing */</span><br><span>      switch (event) {</span><br><span>@@ -788,6 +790,17 @@</span><br><span>              break;</span><br><span>       case GSCON_EV_LCLS_FAIL:</span><br><span>             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSCON_EV_A_COMMON_ID_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+                mi_imsi = data;</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!conn->bsub)</span><br><span style="color: hsl(120, 100%, 40%);">+                   conn->bsub = bsc_subscr_find_or_create_by_imsi(conn->network->bsc_subscribers, mi_imsi->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+            else {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* we already have a bsc_subscr associated; maybe that subscriber has no IMSI yet? */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (!conn->bsub->imsi[0])</span><br><span style="color: hsl(120, 100%, 40%);">+                               bsc_subscr_set_imsi(conn->bsub, mi_imsi->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             gscon_update_id(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(false);</span><br><span>          break;</span><br><span>@@ -879,7 +892,8 @@</span><br><span>         .name = "SUBSCR_CONN",</span><br><span>     .states = gscon_fsm_states,</span><br><span>  .num_states = ARRAY_SIZE(gscon_fsm_states),</span><br><span style="color: hsl(0, 100%, 40%);">-     .allstate_event_mask = S(GSCON_EV_A_DISC_IND) | S(GSCON_EV_A_CLEAR_CMD) | S(GSCON_EV_RSL_CONN_FAIL) |</span><br><span style="color: hsl(120, 100%, 40%);">+ .allstate_event_mask = S(GSCON_EV_A_DISC_IND) | S(GSCON_EV_A_CLEAR_CMD) | S(GSCON_EV_A_COMMON_ID_IND) |</span><br><span style="color: hsl(120, 100%, 40%);">+           S(GSCON_EV_RSL_CONN_FAIL) |</span><br><span>          S(GSCON_EV_LCLS_FAIL) |</span><br><span>      S(GSCON_EV_FORGET_LCHAN) |</span><br><span>           S(GSCON_EV_FORGET_MGW_ENDPOINT),</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index 6b225e4..6cbe6fb 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -1060,6 +1060,38 @@</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Common ID; 3GPP TS 48.008 3.2.1.68 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int bssmap_handle_common_id(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 struct msgb *msg, unsigned int length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_mobile_identity mi_imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_bssap_tlv_parse(&tp, msg->l4h + 1, length - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check for the mandatory elements */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!TLVP_PRESENT(&tp, GSM0808_IE_IMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPFSML(conn->fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "CommonID: missing mandatory IMSI IE: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_hexdump(msg->l4h, length));</span><br><span style="color: hsl(120, 100%, 40%);">+          return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else if ((TLVP_VAL(&tp, GSM0808_IE_IMSI)[0] & GSM_MI_TYPE_MASK) != GSM_MI_TYPE_IMSI) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSML(conn->fi, LOGL_ERROR, "CommonID: Wrong content in the IMSI IE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (osmo_mobile_identity_decode(&mi_imsi, TLVP_VAL(&tp, GSM0808_IE_IMSI), TLVP_LEN(&tp, GSM0808_IE_IMSI), false)</span><br><span style="color: hsl(120, 100%, 40%);">+      || mi_imsi.type != GSM_MI_TYPE_IMSI) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPFSML(conn->fi, LOGL_ERROR, "CommonID: could not parse IMSI\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_COMMON_ID_IND, &mi_imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int bssmap_rcvmsg_udt(struct bsc_msc_data *msc,</span><br><span>                        struct msgb *msg, unsigned int length)</span><br><span> {</span><br><span>@@ -1140,6 +1172,10 @@</span><br><span>            rate_ctr_inc(&ctrs[MSC_CTR_BSSMAP_RX_DT1_CONFUSION]);</span><br><span>            ret = bssmap_handle_confusion(conn, msg, length);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case BSS_MAP_MSG_COMMON_ID:</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc(&ctrs[MSC_CTR_BSSMAP_RX_DT1_COMMON_ID]);</span><br><span style="color: hsl(120, 100%, 40%);">+             ret = bssmap_handle_common_id(conn, msg, length);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span>       default:</span><br><span>             rate_ctr_inc(&ctrs[MSC_CTR_BSSMAP_RX_DT1_UNKNOWN]);</span><br><span>              LOGP(DMSC, LOGL_NOTICE, "Unimplemented msg type: %s\n",</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_msc.c b/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>index 9b00ffc..aa2a671 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>@@ -57,6 +57,7 @@</span><br><span>       [MSC_CTR_BSSMAP_RX_DT1_HANDOVER_CMD] =      {"bssmap:rx:dt1:handover:cmd", "Number of received BSSMAP DT1 HANDOVER CMD messages"},</span><br><span>       [MSC_CTR_BSSMAP_RX_DT1_CLASSMARK_RQST] =    {"bssmap:rx:dt1:classmark:rqst", "Number of received BSSMAP DT1 CLASSMARK RQST messages"},</span><br><span>   [MSC_CTR_BSSMAP_RX_DT1_CONFUSION] =         {"bssmap:rx:dt1:confusion", "Number of received BSSMAP DT1 CONFUSION messages"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [MSC_CTR_BSSMAP_RX_DT1_COMMON_ID] =         {"bssmap:rx:dt1:common_id", "Number of received BSSMAP DT1 COMMON ID messages"},</span><br><span>     [MSC_CTR_BSSMAP_RX_DT1_UNKNOWN] =           {"bssmap:rx:dt1:err_unknown", "Number of received BSSMAP unknown DT1 messages"},</span><br><span>     [MSC_CTR_BSSMAP_RX_DT1_DTAP] =              {"bssmap:rx:dt1:dtap:good", "Number of received BSSMAP DTAP messages"},</span><br><span>      [MSC_CTR_BSSMAP_RX_DT1_DTAP_ERROR] =        {"bssmap:rx:dt1:dtap:error", "Number of received BSSMAP DTAP messages with errors"},</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18942">change 18942</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bsc/+/18942"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I52c43fb940f0db796adf4c0adb2260321c721c39 </div>
<div style="display:none"> Gerrit-Change-Number: 18942 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>