<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>