<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13006">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Neels Hofmeyr: Looks good to me, approved

</div><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.<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, 79 insertions(+), 0 deletions(-)<br><br></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 19cfebb..8078db0 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -441,6 +441,82 @@</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 char namebuf[255];</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGP_GSUP_FWD(gsup, level, fmt, args ...) \</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DMAIN, level, "Forward %s (class=%s, IMSI=%s, %s->%s): " fmt, \</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_gsup_message_type_name(gsup->message_type), \</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_gsup_message_class_name(gsup->message_class), \</span><br><span style="color: hsl(120, 100%, 40%);">+       gsup->imsi, \</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_quote_str((const char *)gsup->source_name, gsup->source_name_len), \</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_quote_str_buf2(namebuf, sizeof(namebuf), (const char *)gsup->destination_name, gsup->destination_name_len), \</span><br><span style="color: hsl(120, 100%, 40%);">+      ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int read_cb_forward(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%);">+   int ret = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_gsup_message *gsup_err;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: it would be better if the msgb never were deallocated immediately by osmo_gsup_addr_send(), which a</span><br><span style="color: hsl(120, 100%, 40%);">+  * select-loop volatile talloc context could facilitate. Then we would still be able to access gsup-> members</span><br><span style="color: hsl(120, 100%, 40%);">+       * (pointing into the msgb) even after sending failed, and we wouldn't need to copy this data before sending: */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Prepare error message (before IEs get deallocated) */</span><br><span style="color: hsl(120, 100%, 40%);">+      gsup_err = talloc_zero(hlr_ctx, struct osmo_gsup_message);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_STRLCPY_ARRAY(gsup_err->imsi, gsup->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ gsup_err->message_class = gsup->message_class;</span><br><span style="color: hsl(120, 100%, 40%);">+  gsup_err->destination_name = talloc_memdup(gsup_err, gsup->destination_name, gsup->destination_name_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    gsup_err->destination_name_len = gsup->destination_name_len;</span><br><span style="color: hsl(120, 100%, 40%);">+    gsup_err->message_type = OSMO_GSUP_MSGT_E_ROUTING_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+   gsup_err->session_id = gsup->session_id;</span><br><span style="color: hsl(120, 100%, 40%);">+        gsup_err->source_name = talloc_memdup(gsup_err, gsup->source_name, gsup->source_name_len);</span><br><span style="color: hsl(120, 100%, 40%);">+   gsup_err->source_name_len = gsup->source_name_len;</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 || !gsup->source_name_len || !gsup->destination_name || !gsup->destination_name_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP_GSUP_FWD(gsup, LOGL_ERROR, "missing routing IEs\n");</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_GSUP_FWD(gsup, LOGL_ERROR, "mismatching source name\n");</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%);">+   if (!msgb_l2(msg) || !msgb_l2len(msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP_GSUP_FWD(gsup, LOGL_ERROR, "missing or empty l2 data\n");</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_GSUP_FWD(gsup, LOGL_INFO, "checks passed, forwarding\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Remove incoming IPA header to be able to prepend an outgoing IPA header */</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_pull_to_l2(msg);</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);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* AT THIS POINT, THE msg MAY BE DEALLOCATED and the data like gsup->imsi, gsup->source_name etc may all be</span><br><span style="color: hsl(120, 100%, 40%);">+      * invalid and cause segfaults. */</span><br><span style="color: hsl(120, 100%, 40%);">+    msg = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+   gsup = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret == -ENODEV)</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP_GSUP_FWD(gsup_err, LOGL_ERROR, "destination not connected\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (ret)</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP_GSUP_FWD(gsup_err, LOGL_ERROR, "unknown error %i\n", ret);</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%);">+     /* Send error back to source */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ret) {</span><br><span style="color: hsl(120, 100%, 40%);">+            struct msgb *msg_err = msgb_alloc_headroom(1024+16, 16, "GSUP forward ERR response");</span><br><span style="color: hsl(120, 100%, 40%);">+               OSMO_ASSERT(msg_err);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_gsup_encode(msg_err, gsup_err);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP_GSUP_FWD(gsup_err, LOGL_NOTICE, "Tx %s\n", osmo_gsup_message_type_name(gsup_err->message_type));</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_gsup_conn_send(conn, msg_err);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_free(gsup_err);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (msg)</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>@@ -459,6 +535,9 @@</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> </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: merged </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: 13 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: Vadim Yanitskiy <axilirator@gmail.com> </div>