<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13006">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hlr.c: forward GSUP messages between clients<br><br>Allow clients to forward any GSUP message between clients. Determine the<br>sender and receiver from the new {source,dest}_name{,_len} IEs. Reject<br>messages with a forged source name or invalid source/dest name lengths.<br><br>This will be used for the inter-MSC handover.<br><br>Depends: Ic00b0601eacff6d72927cea51767801142ee75db (libosmocore.git)<br>Related: OS#3793<br>Change-Id: Ia4f345abc877baaf0a8f73b8988e6514d9589bf5<br>---<br>M src/hlr.c<br>1 file changed, 50 insertions(+), 0 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/06/13006/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/hlr.c b/src/hlr.c</span><br><span>index c544310..15ebc20 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -440,6 +440,53 @@</span><br><span>  return osmo_gsup_conn_send(conn, msg_out);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int read_cb_forward(const struct osmo_gsup_conn *conn, struct msgb *msg, const struct osmo_gsup_message *gsup)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg_out;</span><br><span style="color: hsl(120, 100%, 40%);">+ int ret = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Check for routing IEs */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!gsup->source_name</span><br><span style="color: hsl(120, 100%, 40%);">+         || !gsup->source_name_len</span><br><span style="color: hsl(120, 100%, 40%);">+          || !gsup->destination_name</span><br><span style="color: hsl(120, 100%, 40%);">+         || !gsup->destination_name_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMAIN, LOGL_ERROR, "Can't forward GSUP message for IMSI %s: missing routing IEs\n", gsup->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                goto end;</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%);">+   /* Verify source/dest string length */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (gsup->source_name_len < 1</span><br><span style="color: hsl(120, 100%, 40%);">+       || gsup->destination_name_len < 1</span><br><span style="color: hsl(120, 100%, 40%);">+       || gsup->source_name[gsup->source_name_len - 1] != '\0'</span><br><span style="color: hsl(120, 100%, 40%);">+         || gsup->destination_name[gsup->destination_name_len - 1] != '\0')</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMAIN, LOGL_ERROR, "Can't forward GSUP message for IMSI %s: unexpected source/dest length\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   gsup->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+          goto end;</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%);">+   /* Verify source name (e.g. "MSC-00-00-00-00-00-00") */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gsup_route_find(conn->server, gsup->source_name, gsup->source_name_len) != conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DMAIN, LOGL_ERROR, "Can't forward GSUP message for IMSI %s: invalid source name '%s'\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                gsup->imsi, gsup->source_name);</span><br><span style="color: hsl(120, 100%, 40%);">+            goto end;</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%);">+   /* Forward message without re-encoding (so we don't remove unknown IEs) */</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGP(DMAIN, LOGL_DEBUG, "Forwarding GSUP message for IMSI %s from %s to %s\n", gsup->imsi, gsup->source_name,</span><br><span style="color: hsl(120, 100%, 40%);">+      gsup->destination_name);</span><br><span style="color: hsl(120, 100%, 40%);">+      msg_out = msgb_alloc_headroom(1024+16, 16, "GSUP FORWARD");</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = osmo_gsup_addr_send(g_hlr->gs, gsup->destination_name, gsup->destination_name_len, msg_out);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ret)</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMAIN, LOGL_ERROR, "Can't forward GSUP message for IMSI %s from %s to %s: destination not"</span><br><span style="color: hsl(120, 100%, 40%);">+                                 " connected?\n", gsup->imsi, gsup->source_name, gsup->destination_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+end:</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: send message back to sender on failure (new GSUP message type?) */</span><br><span style="color: hsl(120, 100%, 40%);">+  msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int read_cb(struct osmo_gsup_conn *conn, struct msgb *msg)</span><br><span> {</span><br><span>   static struct osmo_gsup_message gsup;</span><br><span>@@ -456,6 +503,9 @@</span><br><span>  if (strlen(gsup.imsi) < 5)</span><br><span>                return gsup_send_err_reply(conn, gsup.imsi, gsup.message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (gsup.destination_name_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                return read_cb_forward(conn, msg, &gsup);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      switch (gsup.message_type) {</span><br><span>         /* requests sent to us */</span><br><span>    case OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13006">change 13006</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/13006"/><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: Ia4f345abc877baaf0a8f73b8988e6514d9589bf5 </div>
<div style="display:none"> Gerrit-Change-Number: 13006 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>