<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13122">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add gsm0808_cell_id_from_cgi(), gsm0808_cell_id_to_cgi()<br><br>For example, for Paging, osmo-msc has a CGI for a subscriber and needs to send<br>out a Cell Identifier IE. Makes sense to add this conversion here. While at it,<br>also provide the reverse conversion.<br><br>Change-Id: Ib9af67b100c4583342a2103669732dab2e577b04<br>---<br>M include/osmocom/gsm/gsm0808_utils.h<br>M src/gsm/gsm0808_utils.c<br>M src/gsm/libosmogsm.map<br>3 files changed, 91 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/22/13122/1</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/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c</span><br><span>index 5477598..0426f78 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,92 @@</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: 0x1 == PLMN, 0x2 == LAC, 0x4 == CI; 0 if nothing was 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 0x1 | 0x2 | 0x4;</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 0x2 | 0x4;</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 0x4;</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 0x1 | 0x2;</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 0x2;</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></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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>