<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12468">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Vadim Yanitskiy: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add osmo_mi_name(), for MI-to-string like "IMSI-123456"<br><br>We have gsm48_mi_to_string() and osmo_bcd2str(), but still lack a function that<br>conveniently prints both MI type and value in one function call.<br><br>Related: http://people.osmocom.org/neels/mi_mi_mi.jpg<br>Change-Id: I7798c3ef983c2e333b2b9cbffef6f366f370bd81<br>---<br>M include/osmocom/gsm/gsm48.h<br>M src/gsm/gsm48.c<br>M src/gsm/libosmogsm.map<br>M tests/gsm0408/gsm0408_test.c<br>M tests/gsm0408/gsm0408_test.ok<br>5 files changed, 82 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm48.h b/include/osmocom/gsm/gsm48.h</span><br><span>index 2b14e6c..0f5727a 100644</span><br><span>--- a/include/osmocom/gsm/gsm48.h</span><br><span>+++ b/include/osmocom/gsm/gsm48.h</span><br><span>@@ -53,6 +53,7 @@</span><br><span> int gsm48_mi_to_string(char *string, const int str_len,</span><br><span>                  const uint8_t *mi, const int mi_len);</span><br><span> const char *gsm48_mi_type_name(uint8_t mi);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *osmo_mi_name(const uint8_t *mi, uint8_t mi_len);</span><br><span> </span><br><span> /* Parse Routeing Area Identifier */</span><br><span> void gsm48_parse_ra(struct gprs_ra_id *raid, const uint8_t *buf);</span><br><span>diff --git a/src/gsm/gsm48.c b/src/gsm/gsm48.c</span><br><span>index 190622f..853ea51 100644</span><br><span>--- a/src/gsm/gsm48.c</span><br><span>+++ b/src/gsm/gsm48.c</span><br><span>@@ -433,6 +433,42 @@</span><br><span>  return get_value_string(mi_type_names, mi);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Return a human readable representation of a Mobile Identity in static buffer.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] mi  Mobile Identity buffer containing 3GPP TS 04.08 style MI type and data.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] mi_len  Length of mi.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return A string like "IMSI-1234567", "TMSI-0x1234ABCD" or "unknown", "TMSI-invalid"...</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+const char *osmo_mi_name(const uint8_t *mi, uint8_t mi_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      static char mi_name[10 + GSM48_MI_SIZE + 1];</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t mi_type;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+        char mi_string[GSM48_MI_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      mi_type = (mi && mi_len) ? (mi[0] & GSM_MI_TYPE_MASK) : GSM_MI_TYPE_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       switch (mi_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case GSM_MI_TYPE_TMSI:</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Table 10.5.4.3, reverse generate_mid_from_tmsi */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (mi_len == GSM48_TMSI_LEN && mi[0] == (0xf0 | GSM_MI_TYPE_TMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 tmsi = osmo_load32be(&mi[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     snprintf(mi_name, sizeof(mi_name), "TMSI-0x%08" PRIX32, tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                      return mi_name;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             return "TMSI-invalid";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    case GSM_MI_TYPE_IMSI:</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_MI_TYPE_IMEI:</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_MI_TYPE_IMEISV:</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_bcd2str(mi_string, sizeof(mi_string), mi, 1, (mi_len * 2) - (mi[0] & GSM_MI_ODD ? 0 : 1), true);</span><br><span style="color: hsl(120, 100%, 40%);">+             snprintf(mi_name, sizeof(mi_name), "%s-%s", gsm48_mi_type_name(mi_type), mi_string);</span><br><span style="color: hsl(120, 100%, 40%);">+                return mi_name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return "unknown";</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> /*! Checks is particular message is cipherable in A/Gb mode according to</span><br><span>  *         3GPP TS 24.008 ยง 4.7.1.2</span><br><span>  *  \param[in] hdr Message header</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index bb97878..8b7a164 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -325,6 +325,7 @@</span><br><span> gsm48_set_dtx;</span><br><span> gsm48_dtx_mode;</span><br><span> gsm48_mi_type_name;</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_mi_name;</span><br><span> gsm48_mcc_mnc_to_bcd;</span><br><span> gsm48_mcc_mnc_from_bcd;</span><br><span> gsm48_generate_lai2;</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index 9bb320d..37ef3f1 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -355,6 +355,7 @@</span><br><span> struct test_mid_encode_decode_test {</span><br><span>         uint8_t mi_type;</span><br><span>     const char *mi_str;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *mi_name;</span><br><span>         size_t str_size;</span><br><span>     const char *expect_mi_tlv_hex;</span><br><span>       const char *expect_str;</span><br><span>@@ -365,31 +366,37 @@</span><br><span>      {</span><br><span>            .mi_type = GSM_MI_TYPE_IMSI,</span><br><span>                 .mi_str = "123456789012345",</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_name = "IMSI-123456789012345",</span><br><span>                 .expect_mi_tlv_hex = "17081932547698103254",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMSI,</span><br><span>                 .mi_str = "12345678901234",</span><br><span style="color: hsl(120, 100%, 40%);">+         .mi_name = "IMSI-12345678901234",</span><br><span>          .expect_mi_tlv_hex = "170811325476981032f4",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMSI,</span><br><span>                 .mi_str = "423423",</span><br><span style="color: hsl(120, 100%, 40%);">+         .mi_name = "IMSI-423423",</span><br><span>          .expect_mi_tlv_hex = "1704413224f3",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMSI | GSM_MI_ODD,</span><br><span>            .mi_str = "423423",</span><br><span style="color: hsl(120, 100%, 40%);">+         .mi_name = "IMSI-423423",</span><br><span>          .expect_mi_tlv_hex = "1704413224f3",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMSI,</span><br><span>                 .mi_str = "4234235",</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_name = "IMSI-4234235",</span><br><span>                 .expect_mi_tlv_hex = "170449322453",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMSI,</span><br><span>                 .mi_str = "4234235",</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_name = "IMSI-4234235",</span><br><span>                 .expect_mi_tlv_hex = "170449322453",</span><br><span>               .str_size = 4,</span><br><span>               .expect_str = "423",</span><br><span>@@ -397,26 +404,31 @@</span><br><span>       {</span><br><span>            .mi_type = GSM_MI_TYPE_IMEI,</span><br><span>                 .mi_str = "123456789012345",</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_name = "IMEI-123456789012345",</span><br><span>                 .expect_mi_tlv_hex = "17081a32547698103254",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMEI,</span><br><span>                 .mi_str = "98765432109876",</span><br><span style="color: hsl(120, 100%, 40%);">+         .mi_name = "IMEI-98765432109876",</span><br><span>          .expect_mi_tlv_hex = "170892785634129078f6",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMEI,</span><br><span>                 .mi_str = "987654321098765",</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_name = "IMEI-987654321098765",</span><br><span>                 .expect_mi_tlv_hex = "17089a78563412907856",</span><br><span>       },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMEISV,</span><br><span>               .mi_str = "987654321098765432",</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_name = "IMEI-SV-987654321098765432",</span><br><span>           .expect_mi_tlv_hex = "170a937856341290785634f2",</span><br><span>   },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_IMEISV,</span><br><span>               .mi_str = "987654321098765432",</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_name = "IMEI-SV-987654321098765432",</span><br><span>           .expect_mi_tlv_hex = "170a937856341290785634f2",</span><br><span>           .str_size = 16,</span><br><span>              .expect_str = "987654321098765",</span><br><span>@@ -425,18 +437,21 @@</span><br><span>           /* gsm48 treats TMSI as decimal string */</span><br><span>            .mi_type = GSM_MI_TYPE_TMSI,</span><br><span>                 .mi_str = "305419896", /* 0x12345678 as decimal */</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_name = "TMSI-0x12345678",</span><br><span>              .expect_mi_tlv_hex = "1705f412345678",</span><br><span>             .expect_rc = 9, /* exception: gsm48_mi_to_string() for TMSI returns strlen(), not bytes! */</span><br><span>  },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_TMSI,</span><br><span>                 .mi_str = "12648430", /* 0xc0ffee as decimal */</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_name = "TMSI-0x00C0FFEE",</span><br><span>              .expect_mi_tlv_hex = "1705f400c0ffee",</span><br><span>             .expect_rc = 8, /* exception: gsm48_mi_to_string() for TMSI returns strlen(), not bytes! */</span><br><span>  },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_TMSI,</span><br><span>                 .mi_str = "0",</span><br><span style="color: hsl(120, 100%, 40%);">+              .mi_name = "TMSI-0x00000000",</span><br><span>              .expect_mi_tlv_hex = "1705f400000000",</span><br><span>             .expect_rc = 1, /* exception: gsm48_mi_to_string() for TMSI returns strlen(), not bytes! */</span><br><span>  },</span><br><span>@@ -444,6 +459,7 @@</span><br><span>             /* gsm48 treats TMSI as decimal string */</span><br><span>            .mi_type = GSM_MI_TYPE_TMSI,</span><br><span>                 .mi_str = "305419896", /* 0x12345678 as decimal */</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_name = "TMSI-0x12345678",</span><br><span>              .expect_mi_tlv_hex = "1705f412345678",</span><br><span>             .str_size = 5,</span><br><span>               .expect_str = "3054",</span><br><span>@@ -452,18 +468,21 @@</span><br><span>      {</span><br><span>            .mi_type = GSM_MI_TYPE_NONE,</span><br><span>                 .mi_str = "123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .mi_name = "unknown",</span><br><span>              .expect_mi_tlv_hex = "17021832", /* encoding invalid MI type */</span><br><span>            .expect_str = "",</span><br><span>  },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_TYPE_NONE,</span><br><span>                 .mi_str = "1234",</span><br><span style="color: hsl(120, 100%, 40%);">+           .mi_name = "unknown",</span><br><span>              .expect_mi_tlv_hex = "17031032f4", /* encoding invalid MI type */</span><br><span>          .expect_str = "",</span><br><span>  },</span><br><span>   {</span><br><span>            .mi_type = GSM_MI_ODD,</span><br><span>               .mi_str = "1234",</span><br><span style="color: hsl(120, 100%, 40%);">+           .mi_name = "unknown",</span><br><span>              .expect_mi_tlv_hex = "17031032f4", /* encoding invalid MI type */</span><br><span>          .expect_str = "",</span><br><span>  },</span><br><span>@@ -512,6 +531,13 @@</span><br><span>            if (rc != expect_rc)</span><br><span>                         printf("     ERROR: expected rc=%d\n", expect_rc);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+              if (t->mi_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  const char *mi_name = osmo_mi_name(mi_buf, mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("  -> MI-name=%s\n", osmo_quote_str(mi_name, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (strcmp(mi_name, t->mi_name))</span><br><span style="color: hsl(120, 100%, 40%);">+                           printf("     ERROR: expected MI-name=%s\n", osmo_quote_str(t->mi_name, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          /* Now make sure the resulting string is always '\0' terminated.</span><br><span>              * The above started out with a zeroed buffer, now repeat with a tainted one. */</span><br><span>             str_len = strlen(str);</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok</span><br><span>index d6579e5..0c13555 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.ok</span><br><span>+++ b/tests/gsm0408/gsm0408_test.ok</span><br><span>@@ -7,57 +7,75 @@</span><br><span> - IMSI 123456789012345</span><br><span>   -> MI-TLV-hex='17081932547698103254'</span><br><span>   -> MI-str="123456789012345" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMSI-123456789012345"</span><br><span> - IMSI 12345678901234</span><br><span>   -> MI-TLV-hex='170811325476981032f4'</span><br><span>   -> MI-str="12345678901234" rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMSI-12345678901234"</span><br><span> - IMSI 423423</span><br><span>   -> MI-TLV-hex='1704413224f3'</span><br><span>   -> MI-str="423423" rc=7</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMSI-423423"</span><br><span> - unknown 0x9 423423</span><br><span>   -> MI-TLV-hex='1704413224f3'</span><br><span>   -> MI-str="423423" rc=7</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMSI-423423"</span><br><span> - IMSI 4234235</span><br><span>   -> MI-TLV-hex='170449322453'</span><br><span>   -> MI-str="4234235" rc=8</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMSI-4234235"</span><br><span> - IMSI 4234235</span><br><span>   -> MI-TLV-hex='170449322453'</span><br><span>   -> MI-str="423" rc=4</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMSI-4234235"</span><br><span> - IMEI 123456789012345</span><br><span>   -> MI-TLV-hex='17081a32547698103254'</span><br><span>   -> MI-str="123456789012345" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMEI-123456789012345"</span><br><span> - IMEI 98765432109876</span><br><span>   -> MI-TLV-hex='170892785634129078f6'</span><br><span>   -> MI-str="98765432109876" rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMEI-98765432109876"</span><br><span> - IMEI 987654321098765</span><br><span>   -> MI-TLV-hex='17089a78563412907856'</span><br><span>   -> MI-str="987654321098765" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMEI-987654321098765"</span><br><span> - IMEI-SV 987654321098765432</span><br><span>   -> MI-TLV-hex='170a937856341290785634f2'</span><br><span>   -> MI-str="987654321098765432" rc=19</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMEI-SV-987654321098765432"</span><br><span> - IMEI-SV 987654321098765432</span><br><span>   -> MI-TLV-hex='170a937856341290785634f2'</span><br><span>   -> MI-str="987654321098765" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="IMEI-SV-987654321098765432"</span><br><span> - TMSI 305419896</span><br><span>   -> MI-TLV-hex='1705f412345678'</span><br><span>   -> MI-str="305419896" rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="TMSI-0x12345678"</span><br><span> - TMSI 12648430</span><br><span>   -> MI-TLV-hex='1705f400c0ffee'</span><br><span>   -> MI-str="12648430" rc=8</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="TMSI-0x00C0FFEE"</span><br><span> - TMSI 0</span><br><span>   -> MI-TLV-hex='1705f400000000'</span><br><span>   -> MI-str="0" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="TMSI-0x00000000"</span><br><span> - TMSI 305419896</span><br><span>   -> MI-TLV-hex='1705f412345678'</span><br><span>   -> MI-str="3054" rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="TMSI-0x12345678"</span><br><span> - NONE 123</span><br><span>   -> MI-TLV-hex='17021832'</span><br><span>   -> MI-str="" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="unknown"</span><br><span> - NONE 1234</span><br><span>   -> MI-TLV-hex='17031032f4'</span><br><span>   -> MI-str="" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="unknown"</span><br><span> - unknown 0x8 1234</span><br><span>   -> MI-TLV-hex='17031032f4'</span><br><span>   -> MI-str="" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-name="unknown"</span><br><span> </span><br><span> Decoding zero length Mobile Identities</span><br><span> - MI type: IMSI</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12468">change 12468</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/12468"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I7798c3ef983c2e333b2b9cbffef6f366f370bd81 </div>
<div style="display:none"> Gerrit-Change-Number: 12468 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>