<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/15916">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add osmo_gsup_conn_send_err_reply()<br><br>Remove hlr.c's static gsup_send_err_reply(), and create new<br>osmo_gsup_conn_send_err_reply(), as used in osmo-msc. It includes more of the<br>newer IEs in the response, like an SS/USSD session id.<br><br>Prepares for adding D-GSM / MS lookup, which will need this function moved to a<br>non-static context.<br><br>Change-Id: I792fd9993ab2a323af58782a357d71205c43b72a<br>---<br>M src/gsup_server.c<br>M src/gsup_server.h<br>M src/hlr.c<br>3 files changed, 41 insertions(+), 23 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/16/15916/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gsup_server.c b/src/gsup_server.c</span><br><span>index 2870e9d..b08d6ce 100644</span><br><span>--- a/src/gsup_server.c</span><br><span>+++ b/src/gsup_server.c</span><br><span>@@ -57,6 +57,39 @@</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_gsup_conn_send_err_reply(struct osmo_gsup_conn *conn, const struct osmo_gsup_message *gsup_orig,</span><br><span style="color: hsl(120, 100%, 40%);">+                           enum gsm48_gmm_cause cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_gsup_message gsup_reply;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg_out;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No need to answer if we couldn't parse an ERROR message type, only REQUESTs need an error reply. */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!OSMO_GSUP_IS_MSGT_REQUEST(gsup_orig->message_type))</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%);">+   gsup_reply = (struct osmo_gsup_message){</span><br><span style="color: hsl(120, 100%, 40%);">+              .cause = cause,</span><br><span style="color: hsl(120, 100%, 40%);">+               .message_type = OSMO_GSUP_TO_MSGT_ERROR(gsup_orig->message_type),</span><br><span style="color: hsl(120, 100%, 40%);">+          .message_class = gsup_orig->message_class,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* RP-Message-Reference is mandatory for SM Service */</span><br><span style="color: hsl(120, 100%, 40%);">+                .sm_rp_mr = gsup_orig->sm_rp_mr,</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_STRLCPY_ARRAY(gsup_reply.imsi, gsup_orig->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* For SS/USSD, it's important to keep both session state and ID IEs */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (gsup_orig->session_state != OSMO_GSUP_SESSION_STATE_NONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+            gsup_reply.session_state = OSMO_GSUP_SESSION_STATE_END;</span><br><span style="color: hsl(120, 100%, 40%);">+               gsup_reply.session_id = gsup_orig->session_id;</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%);">+   msg_out = osmo_gsup_msgb_alloc("GSUP ERR response");</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(msg_out);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gsup_encode(msg_out, &gsup_reply);</span><br><span style="color: hsl(120, 100%, 40%);">+   return osmo_gsup_conn_send(conn, msg_out);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int osmo_gsup_conn_oap_handle(struct osmo_gsup_conn *conn,</span><br><span>                                 struct msgb *msg_rx)</span><br><span> {</span><br><span>diff --git a/src/gsup_server.h b/src/gsup_server.h</span><br><span>index 14f5013..1f67c29 100644</span><br><span>--- a/src/gsup_server.h</span><br><span>+++ b/src/gsup_server.h</span><br><span>@@ -50,6 +50,8 @@</span><br><span> struct msgb *osmo_gsup_msgb_alloc(const char *label);</span><br><span> </span><br><span> int osmo_gsup_conn_send(struct osmo_gsup_conn *conn, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_gsup_conn_send_err_reply(struct osmo_gsup_conn *conn, const struct osmo_gsup_message *gsup_orig,</span><br><span style="color: hsl(120, 100%, 40%);">+                               enum gsm48_gmm_cause cause);</span><br><span> int osmo_gsup_conn_ccm_get(const struct osmo_gsup_conn *clnt, uint8_t **addr,</span><br><span>                         uint8_t tag);</span><br><span> </span><br><span>diff --git a/src/hlr.c b/src/hlr.c</span><br><span>index aef890e..0cc0448 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -456,23 +456,6 @@</span><br><span>         return osmo_gsup_conn_send(conn, msg_out);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int gsup_send_err_reply(struct osmo_gsup_conn *conn, const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                                enum osmo_gsup_message_type type_in, uint8_t err_cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int type_err = OSMO_GSUP_TO_MSGT_ERROR(type_in);</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_gsup_message gsup_reply = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-      struct msgb *msg_out;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_STRLCPY_ARRAY(gsup_reply.imsi, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-      gsup_reply.message_type = type_err;</span><br><span style="color: hsl(0, 100%, 40%);">-     gsup_reply.cause = err_cause;</span><br><span style="color: hsl(0, 100%, 40%);">-   msg_out = osmo_gsup_msgb_alloc("GSUP ERR response");</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(msg_out);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_gsup_encode(msg_out, &gsup_reply);</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGP(DMAIN, LOGL_NOTICE, "Tx %s\n", osmo_gsup_message_type_name(type_err));</span><br><span style="color: hsl(0, 100%, 40%);">-   return osmo_gsup_conn_send(conn, msg_out);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int rx_check_imei_req(struct osmo_gsup_conn *conn, const struct osmo_gsup_message *gsup)</span><br><span> {</span><br><span>  struct osmo_gsup_message gsup_reply = {0};</span><br><span>@@ -483,7 +466,7 @@</span><br><span>     /* Require IMEI */</span><br><span>   if (!gsup->imei_enc) {</span><br><span>            LOGP(DMAIN, LOGL_ERROR, "%s: missing IMEI\n", gsup->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-         gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO);</span><br><span>          return -1;</span><br><span>   }</span><br><span> </span><br><span>@@ -491,7 +474,7 @@</span><br><span>  rc = gsm48_decode_bcd_number2(imei, sizeof(imei), gsup->imei_enc, gsup->imei_enc_len, 0);</span><br><span>      if (rc < 0) {</span><br><span>             LOGP(DMAIN, LOGL_ERROR, "%s: failed to decode IMEI (rc: %i)\n", gsup->imsi, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-           gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO);</span><br><span>          return -1;</span><br><span>   }</span><br><span> </span><br><span>@@ -499,7 +482,7 @@</span><br><span>  if (strlen(imei) != GSM23003_IMEI_NUM_DIGITS_NO_CHK) {</span><br><span>               LOGP(DMAIN, LOGL_ERROR, "%s: wrong encoded IMEI length (IMEI: '%s', %lu, %i)\n", gsup->imsi, imei,</span><br><span>                   strlen(imei), GSM23003_IMEI_NUM_DIGITS_NO_CHK);</span><br><span style="color: hsl(0, 100%, 40%);">-            gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO);</span><br><span>          return -1;</span><br><span>   }</span><br><span> </span><br><span>@@ -509,7 +492,7 @@</span><br><span>  if (g_hlr->store_imei) {</span><br><span>          LOGP(DAUC, LOGL_DEBUG, "IMSI='%s': storing IMEI = %s\n", gsup->imsi, imei);</span><br><span>             if (db_subscr_update_imei_by_imsi(g_hlr->dbc, gsup->imsi, imei) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO);</span><br><span>                  return -1;</span><br><span>           }</span><br><span>    } else {</span><br><span>@@ -517,7 +500,7 @@</span><br><span>               LOGP(DMAIN, LOGL_INFO, "IMSI='%s': has IMEI = %s (consider setting 'store-imei')\n", gsup->imsi, imei);</span><br><span>                 struct hlr_subscriber subscr;</span><br><span>                if (db_subscr_get_by_imsi(g_hlr->dbc, gsup->imsi, &subscr) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_gsup_conn_send_err_reply(conn, gsup, GMM_CAUSE_INV_MAND_INFO);</span><br><span>                  return -1;</span><br><span>           }</span><br><span>    }</span><br><span>@@ -626,7 +609,7 @@</span><br><span>       * digits is impossible.  Even 5 digits is a highly theoretical case */</span><br><span>      if (strlen(gsup.imsi) < 5) { /* TODO: move this check to libosmogsm/gsup.c? */</span><br><span>            LOGP(DMAIN, LOGL_ERROR, "IMSI too short: %s\n", osmo_quote_str(gsup.imsi, -1));</span><br><span style="color: hsl(0, 100%, 40%);">-               gsup_send_err_reply(conn, gsup.imsi, gsup.message_type, GMM_CAUSE_INV_MAND_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_gsup_conn_send_err_reply(conn, &gsup, GMM_CAUSE_INV_MAND_INFO);</span><br><span>             msgb_free(msg);</span><br><span>              return -EINVAL;</span><br><span>      }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hlr/+/15916">change 15916</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-hlr/+/15916"/><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-Change-Id: I792fd9993ab2a323af58782a357d71205c43b72a </div>
<div style="display:none"> Gerrit-Change-Number: 15916 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>