<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13515">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">USSD: send 'unknown imsi' back to source<br><br>Depends: Ic00b0601eacff6d72927cea51767801142ee75db (libosmocore.git)<br>Change-Id: If5a65f471672949192061c5fe396603611123bc1<br>---<br>M src/hlr_ussd.c<br>1 file changed, 32 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/15/13515/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c</span><br><span>index 7de750f..3a9151c 100644</span><br><span>--- a/src/hlr_ussd.c</span><br><span>+++ b/src/hlr_ussd.c</span><br><span>@@ -171,6 +171,11 @@</span><br><span>      * Still, this should be refreshed in due time, e.g. once per received message. */</span><br><span>   struct hlr_subscriber *subscr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* The IPA name of the entity (MSC/VLR) that sent this message, so we can send "unknown IMSI" errors back.*/</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t *source_name;</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t source_name_len;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool source_fallback;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* we don't keep a pointer to the osmo_gsup_{route,conn} towards the MSC/VLR here,</span><br><span>        * as this might change during inter-VLR hand-over, and we simply look-up the serving MSC/VLR</span><br><span>         * every time we receive an USSD component from the EUSE */</span><br><span>@@ -202,7 +207,8 @@</span><br><span>    ss_session_free(ss);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct ss_session *ss_session_alloc(struct hlr *hlr, const char *imsi, uint32_t session_id)</span><br><span style="color: hsl(120, 100%, 40%);">+struct ss_session *ss_session_alloc(struct hlr *hlr, const char *imsi, uint32_t session_id, const uint8_t *source_name,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 size_t source_name_len)</span><br><span> {</span><br><span>     struct ss_session *ss;</span><br><span> </span><br><span>@@ -214,6 +220,10 @@</span><br><span>    OSMO_STRLCPY_ARRAY(ss->imsi, imsi);</span><br><span>       ss->session_id = session_id;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   ss->source_name = talloc_memdup(ss, source_name, source_name_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ss->source_name);</span><br><span style="color: hsl(120, 100%, 40%);">+      ss->source_name_len = source_name_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Schedule self-destruction timer */</span><br><span>        osmo_timer_setup(&ss->timeout, ss_session_timeout, ss);</span><br><span>       if (g_hlr->ncss_guard_timeout > 0)</span><br><span>@@ -232,6 +242,8 @@</span><br><span> {</span><br><span>  struct hlr_subscriber _subscr = {};</span><br><span>  struct hlr_subscriber *subscr = ss->subscr;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t *vlr_number;</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t vlr_number_len;</span><br><span>       int rc;</span><br><span> </span><br><span>  /* Use subscr as looked up by the caller, or look up now. */</span><br><span>@@ -245,14 +257,24 @@</span><br><span>                 subscr = &_subscr;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!subscr->vlr_number[0]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLGSUP, LOGL_ERROR, "Cannot send GSUP message, no VLR number stored for subscriber %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     subscr->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-          return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       vlr_number = (uint8_t *)&subscr->vlr_number;</span><br><span style="color: hsl(120, 100%, 40%);">+   vlr_number_len = strlen(subscr->vlr_number);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!vlr_number_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ss->source_fallback) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGP(DLGSUP, LOGL_DEBUG, "No VLR number stored for subscriber %s, sending to source instead\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          subscr->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                        vlr_number = ss->source_name;</span><br><span style="color: hsl(120, 100%, 40%);">+                      vlr_number_len = ss->source_name_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DLGSUP, LOGL_ERROR, "Cannot send GSUP message, no VLR number stored for subscriber %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           subscr->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGPSS(ss, LOGL_DEBUG, "Tx USSD for IMSI %s to VLR '%s'\n", subscr->imsi, subscr->vlr_number);</span><br><span style="color: hsl(0, 100%, 40%);">-  return osmo_gsup_addr_send(gs, (uint8_t *)subscr->vlr_number, strlen(subscr->vlr_number), msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPSS(ss, LOGL_DEBUG, "Tx USSD for IMSI %s to VLR %s\n", subscr->imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_quote_str((const char *)vlr_number, vlr_number_len));</span><br><span style="color: hsl(120, 100%, 40%);">+     return osmo_gsup_addr_send(gs, vlr_number, vlr_number_len, msg);</span><br><span> }</span><br><span> </span><br><span> static int ss_tx_to_ms(struct ss_session *ss, enum osmo_gsup_message_type gsup_msg_type,</span><br><span>@@ -527,7 +549,7 @@</span><br><span>                          gsup->imsi, gsup->session_id);</span><br><span>                         goto out_err;</span><br><span>                }</span><br><span style="color: hsl(0, 100%, 40%);">-               ss = ss_session_alloc(hlr, gsup->imsi, gsup->session_id);</span><br><span style="color: hsl(120, 100%, 40%);">+               ss = ss_session_alloc(hlr, gsup->imsi, gsup->session_id, gsup->source_name, gsup->source_name_len);</span><br><span>              if (!ss) {</span><br><span>                   LOGP(DSS, LOGL_ERROR, "%s/0x%08x: Unable to allocate SS session\n",</span><br><span>                                gsup->imsi, gsup->session_id);</span><br><span>@@ -555,6 +577,8 @@</span><br><span>                                           ss->u.euse = hlr->euse_default;</span><br><span>                                        }</span><br><span>                            }</span><br><span style="color: hsl(120, 100%, 40%);">+                             /* send "unknown IMSI" errors back to source */</span><br><span style="color: hsl(120, 100%, 40%);">+                             ss->source_fallback = true;</span><br><span>                       }</span><br><span>                    /* dispatch unstructured SS to routing */</span><br><span>                    handle_ussd(conn, ss, gsup, &req);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13515">change 13515</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/13515"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: If5a65f471672949192061c5fe396603611123bc1 </div>
<div style="display:none"> Gerrit-Change-Number: 13515 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>