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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add gsm0808_cell_id_from_cgi(), gsm0808_cell_id_to_cgi()<br><br>CGI to Cell ID: for example, for Paging, osmo-msc has a CGI for a subscriber<br>and needs to send out a Cell Identifier IE. Makes sense to add this conversion<br>here.<br><br>Cell ID to CGI: for a Layer 3 Complete, a subscriber sends the current cell in<br>the form of a Cell Identifier, which we store as a CGI, if necessary enriched<br>with the local PLMN.<br><br>Add enum with bitmask values to identify parts of a CGI, for the return value<br>of gsm0808_cell_id_to_cgi(). Can't use enum CELL_IDENT for that, because it<br>doesn't have a value for just a PLMN (and is not a bitmask).<br><br>Change-Id: Ib9af67b100c4583342a2103669732dab2e577b04<br>---<br>M include/osmocom/gsm/gsm0808_utils.h<br>M include/osmocom/gsm/gsm23003.h<br>M src/gsm/gsm0808_utils.c<br>M src/gsm/libosmogsm.map<br>M tests/gsm0808/gsm0808_test.c<br>M tests/gsm0808/gsm0808_test.ok<br>6 files changed, 270 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>index 2b48be7..53f145c 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808_utils.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>@@ -84,6 +84,9 @@</span><br><span> bool gsm0808_cell_ids_match(const struct gsm0808_cell_id *id1, const struct gsm0808_cell_id *id2, bool exact_match);</span><br><span> int gsm0808_cell_id_matches_list(const struct gsm0808_cell_id *id, const struct gsm0808_cell_id_list2 *list,</span><br><span>                              unsigned int match_nr, bool exact_match);</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm0808_cell_id_from_cgi(struct gsm0808_cell_id *cid, enum CELL_IDENT id_discr,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const struct osmo_cell_global_id *cgi);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_cell_id_to_cgi(struct osmo_cell_global_id *cgi, const struct gsm0808_cell_id *cid);</span><br><span> </span><br><span> uint8_t gsm0808_enc_cause(struct msgb *msg, uint16_t cause);</span><br><span> uint8_t gsm0808_enc_aoip_trasp_addr(struct msgb *msg,</span><br><span>diff --git a/include/osmocom/gsm/gsm23003.h b/include/osmocom/gsm/gsm23003.h</span><br><span>index b34a677..cf622ce 100644</span><br><span>--- a/include/osmocom/gsm/gsm23003.h</span><br><span>+++ b/include/osmocom/gsm/gsm23003.h</span><br><span>@@ -30,6 +30,15 @@</span><br><span>        uint16_t cell_identity;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Bitmask of items contained in a struct osmo_cell_global_id.</span><br><span style="color: hsl(120, 100%, 40%);">+ * See also gsm0808_cell_id_to_cgi().</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_cgi_part {</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_CGI_PART_PLMN = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_CGI_PART_LAC = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_CGI_PART_CI = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Actually defined in 3GPP TS 48.008 3.2.2.27 Cell Identifier List,</span><br><span>  * but conceptually belongs with the above structures. */</span><br><span> struct osmo_lac_and_ci_id {</span><br><span>diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c</span><br><span>index 5477598..dd14d3c 100644</span><br><span>--- a/src/gsm/gsm0808_utils.c</span><br><span>+++ b/src/gsm/gsm0808_utils.c</span><br><span>@@ -1577,6 +1577,93 @@</span><br><span>    return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Copy information from a CGI to form a Cell Identifier of the specified kind.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param [out] cid  Compose new Cell Identifier here.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param [in] id_discr  Which kind of Cell Identifier to compose.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param [in] cgi  Cell Global Identifier to form the Cell Identifier from.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm0808_cell_id_from_cgi(struct gsm0808_cell_id *cid, enum CELL_IDENT id_discr,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct osmo_cell_global_id *cgi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       *cid = (struct gsm0808_cell_id){</span><br><span style="color: hsl(120, 100%, 40%);">+              .id_discr = id_discr,</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%);">+  switch (id_discr) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case CELL_IDENT_WHOLE_GLOBAL:</span><br><span style="color: hsl(120, 100%, 40%);">+         cid->id.global = *cgi;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     case CELL_IDENT_LAC_AND_CI:</span><br><span style="color: hsl(120, 100%, 40%);">+           cid->id.lac_and_ci = (struct osmo_lac_and_ci_id){</span><br><span style="color: hsl(120, 100%, 40%);">+                  .lac = cgi->lai.lac,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .ci = cgi->cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+          };</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     case CELL_IDENT_CI:</span><br><span style="color: hsl(120, 100%, 40%);">+           cid->id.ci = cgi->cell_identity;</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     case CELL_IDENT_LAI:</span><br><span style="color: hsl(120, 100%, 40%);">+          cid->id.lai_and_lac = cgi->lai;</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     case CELL_IDENT_LAC:</span><br><span style="color: hsl(120, 100%, 40%);">+          cid->id.lac = cgi->lai.lac;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     case CELL_IDENT_NO_CELL:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CELL_IDENT_BSS:</span><br><span style="color: hsl(120, 100%, 40%);">+  case CELL_IDENT_UTRAN_PLMN_LAC_RNC:</span><br><span style="color: hsl(120, 100%, 40%);">+   case CELL_IDENT_UTRAN_RNC:</span><br><span style="color: hsl(120, 100%, 40%);">+    case CELL_IDENT_UTRAN_LAC_RNC:</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</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 style="color: hsl(120, 100%, 40%);">+/*! Overwrite parts of cgi with values from a Cell Identifier.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Place only those items given in cid into cgi, leaving other values unchanged.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] cgi  Cell Global Identity to write to.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] cid  Cell Identity to read from.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return a bitmask of items that were set: OSMO_CGI_PART_PLMN | OSMO_CGI_PART_LAC | OSMO_CGI_PART_CI; 0 if nothing was</span><br><span style="color: hsl(120, 100%, 40%);">+ *         written to cgi.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_cell_id_to_cgi(struct osmo_cell_global_id *cgi, const struct gsm0808_cell_id *cid)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (cid->id_discr) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case CELL_IDENT_WHOLE_GLOBAL:</span><br><span style="color: hsl(120, 100%, 40%);">+         *cgi = cid->id.global;</span><br><span style="color: hsl(120, 100%, 40%);">+             return OSMO_CGI_PART_PLMN | OSMO_CGI_PART_LAC | OSMO_CGI_PART_CI;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   case CELL_IDENT_LAC_AND_CI:</span><br><span style="color: hsl(120, 100%, 40%);">+           cgi->lai.lac = cid->id.lac_and_ci.lac;</span><br><span style="color: hsl(120, 100%, 40%);">+          cgi->cell_identity = cid->id.lac_and_ci.ci;</span><br><span style="color: hsl(120, 100%, 40%);">+             return OSMO_CGI_PART_LAC | OSMO_CGI_PART_CI;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        case CELL_IDENT_CI:</span><br><span style="color: hsl(120, 100%, 40%);">+           cgi->cell_identity = cid->id.ci;</span><br><span style="color: hsl(120, 100%, 40%);">+                return OSMO_CGI_PART_CI;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    case CELL_IDENT_LAI:</span><br><span style="color: hsl(120, 100%, 40%);">+          cgi->lai = cid->id.lai_and_lac;</span><br><span style="color: hsl(120, 100%, 40%);">+         return OSMO_CGI_PART_PLMN | OSMO_CGI_PART_LAC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CELL_IDENT_LAC:</span><br><span style="color: hsl(120, 100%, 40%);">+          cgi->lai.lac = cid->id.lac;</span><br><span style="color: hsl(120, 100%, 40%);">+             return OSMO_CGI_PART_LAC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   case CELL_IDENT_NO_CELL:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CELL_IDENT_BSS:</span><br><span style="color: hsl(120, 100%, 40%);">+  case CELL_IDENT_UTRAN_PLMN_LAC_RNC:</span><br><span style="color: hsl(120, 100%, 40%);">+   case CELL_IDENT_UTRAN_RNC:</span><br><span style="color: hsl(120, 100%, 40%);">+    case CELL_IDENT_UTRAN_LAC_RNC:</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! value_string[] for enum CELL_IDENT. */</span><br><span> const struct value_string gsm0808_cell_id_discr_names[] = {</span><br><span>         { CELL_IDENT_WHOLE_GLOBAL, "CGI" },</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index 2d47d7a..3fadc5a 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -205,6 +205,8 @@</span><br><span> gsm0808_dec_cell_id_list2;</span><br><span> gsm0808_cell_id_list_add;</span><br><span> gsm0808_cell_id_to_list;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_cell_id_to_cgi;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_cell_id_from_cgi;</span><br><span> gsm0808_enc_cell_id;</span><br><span> gsm0808_dec_cell_id;</span><br><span> gsm0808_cell_id_name;</span><br><span>diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c</span><br><span>index af90d00..c448f43 100644</span><br><span>--- a/tests/gsm0808/gsm0808_test.c</span><br><span>+++ b/tests/gsm0808/gsm0808_test.c</span><br><span>@@ -2206,29 +2206,96 @@</span><br><span>  return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const enum CELL_IDENT cell_ident_discrs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  CELL_IDENT_LAC, CELL_IDENT_CI, CELL_IDENT_LAC_AND_CI, CELL_IDENT_LAI_AND_LAC,</span><br><span style="color: hsl(120, 100%, 40%);">+ CELL_IDENT_WHOLE_GLOBAL,</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> static void test_cell_id_list_matching(bool test_match)</span><br><span> {</span><br><span>     int i, j;</span><br><span>    bool ok = true;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     const enum CELL_IDENT discrs[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              CELL_IDENT_LAC, CELL_IDENT_CI, CELL_IDENT_LAC_AND_CI, CELL_IDENT_LAI_AND_LAC,</span><br><span style="color: hsl(0, 100%, 40%);">-           CELL_IDENT_WHOLE_GLOBAL,</span><br><span style="color: hsl(0, 100%, 40%);">-        };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   printf("\n%s(%s)\n", __func__, test_match ? "test match" : "test mismatch");</span><br><span> </span><br><span>       /* Autogenerate Cell ID lists from above dataset, which should match / not match. */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < ARRAY_SIZE(discrs); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           for (j = 0; j < ARRAY_SIZE(discrs); j++)</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < ARRAY_SIZE(cell_ident_discrs); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              for (j = 0; j < ARRAY_SIZE(cell_ident_discrs); j++)</span><br><span>                       if (!test_cell_id_list_matching_discrs(test_match,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             discrs[i], discrs[j]))</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        cell_ident_discrs[i], cell_ident_discrs[j]))</span><br><span>                          ok = false;</span><br><span>  }</span><br><span> </span><br><span>        OSMO_ASSERT(ok);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct gsm0808_cell_id test_gsm0808_cell_id_to_from_cgi_data[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  lac_23,</span><br><span style="color: hsl(120, 100%, 40%);">+       lac_42,</span><br><span style="color: hsl(120, 100%, 40%);">+       ci_5,</span><br><span style="color: hsl(120, 100%, 40%);">+ ci_6,</span><br><span style="color: hsl(120, 100%, 40%);">+ lac_ci_23_5,</span><br><span style="color: hsl(120, 100%, 40%);">+  lac_ci_42_6,</span><br><span style="color: hsl(120, 100%, 40%);">+  lai_23_042_23,</span><br><span style="color: hsl(120, 100%, 40%);">+        lai_23_042_42,</span><br><span style="color: hsl(120, 100%, 40%);">+        lai_23_99_23,</span><br><span style="color: hsl(120, 100%, 40%);">+ lai_23_42_23,</span><br><span style="color: hsl(120, 100%, 40%);">+ cgi_23_042_23_5,</span><br><span style="color: hsl(120, 100%, 40%);">+      cgi_23_042_42_6,</span><br><span style="color: hsl(120, 100%, 40%);">+      cgi_23_99_23_5,</span><br><span style="color: hsl(120, 100%, 40%);">+       { .id_discr = CELL_IDENT_NO_CELL },</span><br><span style="color: hsl(120, 100%, 40%);">+   { .id_discr = 423 },</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%);">+static void test_gsm0808_cell_id_to_from_cgi()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int j;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("\n%s()\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < ARRAY_SIZE(test_gsm0808_cell_id_to_from_cgi_data); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          const struct gsm0808_cell_id *from_cid = &test_gsm0808_cell_id_to_from_cgi_data[i];</span><br><span style="color: hsl(120, 100%, 40%);">+               struct osmo_cell_global_id cgi = {</span><br><span style="color: hsl(120, 100%, 40%);">+                    .lai = {</span><br><span style="color: hsl(120, 100%, 40%);">+                              .plmn = {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     .mcc = 777,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   .mnc = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     .mnc_3_digits = true,</span><br><span style="color: hsl(120, 100%, 40%);">+                         },</span><br><span style="color: hsl(120, 100%, 40%);">+                            .lac = 7777,</span><br><span style="color: hsl(120, 100%, 40%);">+                  },</span><br><span style="color: hsl(120, 100%, 40%);">+                    .cell_identity = 7777,</span><br><span style="color: hsl(120, 100%, 40%);">+                };</span><br><span style="color: hsl(120, 100%, 40%);">+            struct gsm0808_cell_id cid = {};</span><br><span style="color: hsl(120, 100%, 40%);">+              int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = gsm0808_cell_id_to_cgi(&cgi, from_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("cid %s -> cgi %s", gsm0808_cell_id_name(from_cid), osmo_cgi_name(&cgi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (rc & OSMO_CGI_PART_PLMN)</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf(" PLMN");</span><br><span style="color: hsl(120, 100%, 40%);">+            if (rc & OSMO_CGI_PART_LAC)</span><br><span style="color: hsl(120, 100%, 40%);">+                       printf(" LAC");</span><br><span style="color: hsl(120, 100%, 40%);">+             if (rc & OSMO_CGI_PART_CI)</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf(" CI");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            gsm0808_cell_id_from_cgi(&cid, from_cid->id_discr, &cgi);</span><br><span style="color: hsl(120, 100%, 40%);">+          printf(" -> cid %s\n", gsm0808_cell_id_name(&cid));</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!gsm0808_cell_ids_match(from_cid, &cid, true))</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("      MISMATCH!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              for (j = 0; j < ARRAY_SIZE(cell_ident_discrs); j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      enum CELL_IDENT discr = cell_ident_discrs[j];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       gsm0808_cell_id_from_cgi(&cid, discr, &cgi);</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("  --> gsm0808_cell_id{%s} = %s\n", gsm0808_cell_id_discr_name(discr), gsm0808_cell_id_name(&cid));</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 style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>       void *ctx = talloc_named_const(NULL, 0, "gsm0808 test");</span><br><span>@@ -2300,6 +2367,8 @@</span><br><span>   test_cell_id_list_matching(true);</span><br><span>    test_cell_id_list_matching(false);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        test_gsm0808_cell_id_to_from_cgi();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        printf("Done\n");</span><br><span>  return EXIT_SUCCESS;</span><br><span> }</span><br><span>diff --git a/tests/gsm0808/gsm0808_test.ok b/tests/gsm0808/gsm0808_test.ok</span><br><span>index e7df007..6035326 100644</span><br><span>--- a/tests/gsm0808/gsm0808_test.ok</span><br><span>+++ b/tests/gsm0808/gsm0808_test.ok</span><br><span>@@ -629,4 +629,96 @@</span><br><span> CGI:023-042-23-5 and LAC-CI[1]:{42-6}: mismatch</span><br><span> CGI:023-042-23-5 and LAI[3]:{023-042-42, 023-99-23, 023-42-23}: mismatch</span><br><span> CGI:023-042-23-5 and CGI[2]:{023-042-42-6, 023-99-23-5}: mismatch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test_gsm0808_cell_id_to_from_cgi()</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAC:23 -> cgi 777-007-23-7777 LAC -> cid LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAC:42 -> cgi 777-007-42-7777 LAC -> cid LAC:42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:42-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-42-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid CI:5 -> cgi 777-007-7777-5 CI -> cid CI:5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:7777-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-7777-5</span><br><span style="color: hsl(120, 100%, 40%);">+cid CI:6 -> cgi 777-007-7777-6 CI -> cid CI:6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:7777-6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-7777-6</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAC-CI:23-5 -> cgi 777-007-23-5 LAC CI -> cid LAC-CI:23-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-23-5</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAC-CI:42-6 -> cgi 777-007-42-6 LAC CI -> cid LAC-CI:42-6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:42-6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-42-6</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAI:023-042-23 -> cgi 023-042-23-7777 PLMN LAC -> cid LAI:023-042-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-042-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-042-23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAI:023-042-42 -> cgi 023-042-42-7777 PLMN LAC -> cid LAI:023-042-42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:42-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-042-42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-042-42-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAI:023-99-23 -> cgi 023-99-23-7777 PLMN LAC -> cid LAI:023-99-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-99-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-99-23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid LAI:023-42-23 -> cgi 023-42-23-7777 PLMN LAC -> cid LAI:023-42-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-42-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-42-23-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid CGI:023-042-23-5 -> cgi 023-042-23-5 PLMN LAC CI -> cid CGI:023-042-23-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-042-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-042-23-5</span><br><span style="color: hsl(120, 100%, 40%);">+cid CGI:023-042-42-6 -> cgi 023-042-42-6 PLMN LAC CI -> cid CGI:023-042-42-6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:42-6</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-042-42</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-042-42-6</span><br><span style="color: hsl(120, 100%, 40%);">+cid CGI:023-99-23-5 -> cgi 023-99-23-5 PLMN LAC CI -> cid CGI:023-99-23-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:23-5</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:023-99-23</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:023-99-23-5</span><br><span style="color: hsl(120, 100%, 40%);">+cid NO-CELL:NO-CELL -> cgi 777-007-7777-7777 -> cid NO-CELL:NO-CELL</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:7777-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-7777-7777</span><br><span style="color: hsl(120, 100%, 40%);">+cid unknown 0x1a7:unknown 0x1a7 -> cgi 777-007-7777-7777 -> cid unknown 0x1a7:unknown 0x1a7</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC} = LAC:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CI} = CI:7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAC-CI} = LAC-CI:7777-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{LAI} = LAI:777-007-7777</span><br><span style="color: hsl(120, 100%, 40%);">+  --> gsm0808_cell_id{CGI} = CGI:777-007-7777-7777</span><br><span> Done</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13122">change 13122</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/13122"/><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: Ib9af67b100c4583342a2103669732dab2e577b04 </div>
<div style="display:none"> Gerrit-Change-Number: 13122 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </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>