<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13576">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">GSUP: add Kind IE<br><br>osmo-msc and osmo-hlr have distinct subsystems handling incoming GSUP messages.<br>So far we decide entirely by message type which code path should handle a GSUP<br>message. Thus no GSUP message type may be re-used across subsystems.<br><br>If we add a GSUP message to indicate a routing error, it would have to be a<br>distinct message type for subscriber management, another one for SMS, another<br>one for USSD...<br><br>To allow introducing common message types, introduce a GSUP Kind IE.<br><br>In the presence of this IE, GSUP handlers can trivially direct a received<br>message to the right code path. If it is missing, handlers can fall back to the<br>previous switch(message_type) method.<br><br>Change-Id: Ic397a9f2c4a7224e47cab944c72e75ca5592efef<br>---<br>M include/osmocom/gsm/gsup.h<br>M src/gsm/gsup.c<br>M src/gsm/libosmogsm.map<br>M tests/gsup/gsup_test.c<br>M tests/gsup/gsup_test.err<br>5 files changed, 47 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/76/13576/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h</span><br><span>index 29ea11a..d123da5 100644</span><br><span>--- a/include/osmocom/gsm/gsup.h</span><br><span>+++ b/include/osmocom/gsm/gsup.h</span><br><span>@@ -68,6 +68,7 @@</span><br><span>       OSMO_GSUP_FREEZE_PTMSI_IE               = 0x07,</span><br><span>      OSMO_GSUP_MSISDN_IE                     = 0x08,</span><br><span>      OSMO_GSUP_HLR_NUMBER_IE                 = 0x09,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_KIND_IE                       = 0x0a,</span><br><span>      OSMO_GSUP_PDP_CONTEXT_ID_IE             = 0x10,</span><br><span>      OSMO_GSUP_PDP_TYPE_IE                   = 0x11,</span><br><span>      OSMO_GSUP_ACCESS_POINT_NAME_IE          = 0x12,</span><br><span>@@ -229,6 +230,21 @@</span><br><span>       size_t                          pdp_charg_enc_len;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_gsup_kind {</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_GSUP_KIND_UNSET = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_GSUP_KIND_SUBSCRIBER_MANAGEMENT = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_GSUP_KIND_SMS = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_KIND_USSD = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_GSUP_KIND_INTER_MSC = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Keep this as last entry with a value of max(enum osmo_gsup_kind) + 1.</span><br><span style="color: hsl(120, 100%, 40%);">+       * This value shall serve as the size for an array to aid de-muxing all known GSUP kinds. */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_GSUP_KIND_ARRAYSIZE</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%);">+extern const struct value_string osmo_gsup_kind_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *osmo_gsup_kind_name(enum osmo_gsup_kind val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(osmo_gsup_kind_names, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! parsed/decoded GSUP protocol message */</span><br><span> struct osmo_gsup_message {</span><br><span>     enum osmo_gsup_message_type     message_type;</span><br><span>@@ -286,6 +302,11 @@</span><br><span>         const uint8_t                   *imei_enc;</span><br><span>   size_t                          imei_enc_len;</span><br><span>        enum osmo_gsup_imei_result      imei_result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /*! Indicate the subsystem kind to trivially dispatch incoming GSUP messages to the right code paths.</span><br><span style="color: hsl(120, 100%, 40%);">+  * Inter-MSC messages are *required* to set a kind = OSMO_GSUP_KIND_INTER_MSC. For older message kinds, this may</span><br><span style="color: hsl(120, 100%, 40%);">+       * be omitted (for backwards compatibility only -- if in doubt, include it). */</span><br><span style="color: hsl(120, 100%, 40%);">+       enum osmo_gsup_kind             kind;</span><br><span> };</span><br><span> </span><br><span> int osmo_gsup_decode(const uint8_t *data, size_t data_len,</span><br><span>diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c</span><br><span>index a089322..ea79e91 100644</span><br><span>--- a/src/gsm/gsup.c</span><br><span>+++ b/src/gsm/gsup.c</span><br><span>@@ -477,6 +477,10 @@</span><br><span>                    gsup_msg->imei_result = osmo_decode_big_endian(value, value_len) + 1;</span><br><span>                     break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            case OSMO_GSUP_KIND_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                       gsup_msg->kind = osmo_decode_big_endian(value, value_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             default:</span><br><span>                     LOGP(DLGSUP, LOGL_NOTICE,</span><br><span>                         "GSUP IE type %d unknown\n", iei);</span><br><span>@@ -718,7 +722,21 @@</span><br><span>             msgb_tlv_put(msg, OSMO_GSUP_IMEI_RESULT_IE, sizeof(u8), &u8);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (gsup_msg->kind != OSMO_GSUP_KIND_UNSET) {</span><br><span style="color: hsl(120, 100%, 40%);">+              u8 = gsup_msg->kind;</span><br><span style="color: hsl(120, 100%, 40%);">+               msgb_tlv_put(msg, OSMO_GSUP_KIND_IE, sizeof(u8), &u8);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string osmo_gsup_kind_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      { OSMO_GSUP_KIND_UNSET, "unset" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { OSMO_GSUP_KIND_SUBSCRIBER_MANAGEMENT, "Subscriber-Management" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { OSMO_GSUP_KIND_SMS, "SMS" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { OSMO_GSUP_KIND_USSD, "USSD" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { OSMO_GSUP_KIND_INTER_MSC, "Inter-MSC" },</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%);">+</span><br><span> /*! @} */</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index a69fb60..659cfe6 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -567,6 +567,7 @@</span><br><span> osmo_gsup_decode;</span><br><span> osmo_gsup_message_type_names;</span><br><span> osmo_gsup_session_state_names;</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_gsup_kind_names;</span><br><span> osmo_gsup_get_err_msg_type;</span><br><span> </span><br><span> osmo_gsup_sms_encode_sm_rp_da;</span><br><span>diff --git a/tests/gsup/gsup_test.c b/tests/gsup/gsup_test.c</span><br><span>index 4ad7431..3e27e99 100644</span><br><span>--- a/tests/gsup/gsup_test.c</span><br><span>+++ b/tests/gsup/gsup_test.c</span><br><span>@@ -11,6 +11,7 @@</span><br><span> </span><br><span> #define TEST_IMSI_IE 0x01, 0x08, 0x21, 0x43, 0x65, 0x87, 0x09, 0x21, 0x43, 0xf5</span><br><span> #define TEST_IMSI_STR "123456789012345"</span><br><span style="color: hsl(120, 100%, 40%);">+#define TEST_KIND_SUBSCR_IE 0xa, 0x1, 0x1</span><br><span> </span><br><span> static void test_gsup_messages_dec_enc(void)</span><br><span> {</span><br><span>@@ -20,7 +21,8 @@</span><br><span> </span><br><span>        static const uint8_t send_auth_info_req[] = {</span><br><span>                0x08,</span><br><span style="color: hsl(0, 100%, 40%);">-           TEST_IMSI_IE</span><br><span style="color: hsl(120, 100%, 40%);">+          TEST_IMSI_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+         TEST_KIND_SUBSCR_IE</span><br><span>  };</span><br><span> </span><br><span>       static const uint8_t send_auth_info_err[] = {</span><br><span>diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err</span><br><span>index 225735e..9283823 100644</span><br><span>--- a/tests/gsup/gsup_test.err</span><br><span>+++ b/tests/gsup/gsup_test.err</span><br><span>@@ -1,5 +1,5 @@</span><br><span style="color: hsl(0, 100%, 40%);">-  generated message: 08 01 08 21 43 65 87 09 21 43 f5 </span><br><span style="color: hsl(0, 100%, 40%);">-  original message:  08 01 08 21 43 65 87 09 21 43 f5 </span><br><span style="color: hsl(120, 100%, 40%);">+  generated message: 08 01 08 21 43 65 87 09 21 43 f5 0a 01 01 </span><br><span style="color: hsl(120, 100%, 40%);">+  original message:  08 01 08 21 43 65 87 09 21 43 f5 0a 01 01 </span><br><span>   IMSI:              123456789012345</span><br><span>   generated message: 09 01 08 21 43 65 87 09 21 43 f5 02 01 07 </span><br><span>   original message:  09 01 08 21 43 65 87 09 21 43 f5 02 01 07 </span><br><span>@@ -73,7 +73,7 @@</span><br><span>   generated message: 32 01 08 21 43 65 87 09 21 43 f5 51 01 00 </span><br><span>   original message:  32 01 08 21 43 65 87 09 21 43 f5 51 01 00 </span><br><span>   IMSI:              123456789012345</span><br><span style="color: hsl(0, 100%, 40%);">-  message 0: tested 11 truncations, 11 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 0: tested 14 truncations, 13 parse failures</span><br><span>   message 1: tested 14 truncations, 13 parse failures</span><br><span>   message 2: tested 83 truncations, 81 parse failures</span><br><span>   message 3: tested 11 truncations, 11 parse failures</span><br><span>@@ -99,7 +99,7 @@</span><br><span>   message 23: tested 14 truncations, 13 parse failures</span><br><span>   message 24: tested 14 truncations, 13 parse failures</span><br><span> DLGSUP Stopping DLGSUP logging</span><br><span style="color: hsl(0, 100%, 40%);">-  message 0: tested 2816 modifications, 510 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 0: tested 3584 modifications, 771 parse failures</span><br><span>   message 1: tested 3584 modifications, 770 parse failures</span><br><span>   message 2: tested 21248 modifications, 2575 parse failures</span><br><span>   message 3: tested 2816 modifications, 510 parse failures</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13576">change 13576</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/13576"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ic397a9f2c4a7224e47cab944c72e75ca5592efef </div>
<div style="display:none"> Gerrit-Change-Number: 13576 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>