<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22800">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gsm: Introduce API osmo_gsm48_rest_octets_si13_decode<br><br>Related: SYS#5358<br>Change-Id: I74fb0a3afc1ac4aadbfc609b882d929401f790eb<br>---<br>M include/osmocom/gsm/gsm48_rest_octets.h<br>M src/gsm/gsm48_rest_octets.c<br>M src/gsm/libosmogsm.map<br>3 files changed, 131 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/00/22800/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm48_rest_octets.h b/include/osmocom/gsm/gsm48_rest_octets.h</span><br><span>index 8f143be..f295824 100644</span><br><span>--- a/include/osmocom/gsm/gsm48_rest_octets.h</span><br><span>+++ b/include/osmocom/gsm/gsm48_rest_octets.h</span><br><span>@@ -120,7 +120,8 @@</span><br><span>  uint8_t prio_acc_thr;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Generate SI13 Rest Octests (Chapter 10.5.2.37b) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Parse/Generate SI13 Rest Octests (Chapter 10.5.2.37b) */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_gsm48_rest_octets_si13_decode(struct osmo_gsm48_si13_info *si13, const uint8_t *data);</span><br><span> int osmo_gsm48_rest_octets_si13_encode(uint8_t *data, const struct osmo_gsm48_si13_info *si13);</span><br><span> </span><br><span> /* Parse SI3 Rest Octets */</span><br><span>diff --git a/src/gsm/gsm48_rest_octets.c b/src/gsm/gsm48_rest_octets.c</span><br><span>index 1bab8e0..79ee0d9 100644</span><br><span>--- a/src/gsm/gsm48_rest_octets.c</span><br><span>+++ b/src/gsm/gsm48_rest_octets.c</span><br><span>@@ -749,6 +749,134 @@</span><br><span>    return bv.data_len;</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 int decode_t3192(unsigned int t3192)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* See also 3GPP TS 44.060</span><br><span style="color: hsl(120, 100%, 40%);">+       Table 12.24.2: GPRS Cell Options information element details */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (t3192) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case 0: return 500;</span><br><span style="color: hsl(120, 100%, 40%);">+   case 1: return 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+  case 2: return 1500;</span><br><span style="color: hsl(120, 100%, 40%);">+  case 3: return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     case 4: return 80;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 5: return 120;</span><br><span style="color: hsl(120, 100%, 40%);">+   case 6: return 160;</span><br><span style="color: hsl(120, 100%, 40%);">+   case 7: return 200;</span><br><span style="color: hsl(120, 100%, 40%);">+   default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(t3192 <= 7);</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 style="color: hsl(120, 100%, 40%);">+static int decode_drx_timer(unsigned int drx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (drx) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case 0: return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     case 1: return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     case 2: return 2;</span><br><span style="color: hsl(120, 100%, 40%);">+     case 3: return 4;</span><br><span style="color: hsl(120, 100%, 40%);">+     case 4: return 8;</span><br><span style="color: hsl(120, 100%, 40%);">+     case 5: return 16;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 6: return 32;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 7: return 64;</span><br><span style="color: hsl(120, 100%, 40%);">+    default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(drx <= 7);</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 style="color: hsl(120, 100%, 40%);">+static void decode_gprs_cell_opt(struct osmo_gprs_cell_options *gco, struct bitvec *bv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    gco->nmo = bitvec_get_uint(bv, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ gco->t3168 = (bitvec_get_uint(bv, 3) + 1) * 500;</span><br><span style="color: hsl(120, 100%, 40%);">+   gco->t3192 = decode_t3192(bitvec_get_uint(bv, 3));</span><br><span style="color: hsl(120, 100%, 40%);">+ gco->drx_timer_max = decode_drx_timer(bitvec_get_uint(bv, 3));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* ACCESS_BURST_TYPE: */</span><br><span style="color: hsl(120, 100%, 40%);">+      bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* CONTROL_ACK_TYPE: */</span><br><span style="color: hsl(120, 100%, 40%);">+       gco->ctrl_ack_type_use_block = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     gco->bs_cv_max = bitvec_get_uint(bv, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bitvec_get_uint(bv, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_get_uint(bv, 3); /* DEC */</span><br><span style="color: hsl(120, 100%, 40%);">+             bitvec_get_uint(bv, 3); /* INC */</span><br><span style="color: hsl(120, 100%, 40%);">+             bitvec_get_uint(bv, 3); /* MAX */</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%);">+   if (bitvec_get_uint(bv, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t ext_len = bitvec_get_uint(bv, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+             unsigned int cur_bit = bv->cur_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Extension Information */</span><br><span style="color: hsl(120, 100%, 40%);">+           /* R99 extension: */</span><br><span style="color: hsl(120, 100%, 40%);">+          gco->ext_info.egprs_supported = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (gco->ext_info.egprs_supported) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       gco->ext_info.use_egprs_p_ch_req = !bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                        gco->ext_info.bep_period = bitvec_get_uint(bv, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             gco->ext_info.pfc_supported = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+              gco->ext_info.dtm_supported = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+              gco->ext_info.bss_paging_coordination = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* REL-4 extension: */</span><br><span style="color: hsl(120, 100%, 40%);">+                gco->ext_info.ccn_active = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_get_uint(bv, 1); /* NW_EXT_UTBF */</span><br><span style="color: hsl(120, 100%, 40%);">+             bv->cur_bit = cur_bit + ext_len + 1;</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%);">+static void decode_gprs_pwr_ctrl_pars(struct osmo_gprs_power_ctrl_pars *pcp, struct bitvec *bv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    pcp->alpha = bitvec_get_uint(bv, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+       pcp->t_avg_w = bitvec_get_uint(bv,5);</span><br><span style="color: hsl(120, 100%, 40%);">+      pcp->t_avg_t = bitvec_get_uint(bv, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+     pcp->pc_meas_chan = bitvec_get_uint(bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        pcp->n_avg_i = bitvec_get_uint(bv, 4);</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%);">+/*! Decode SI13 Rest Octests (04.08 Chapter 10.5.2.37b).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] si13 decoded SI13 rest octets</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] encoded SI13 rest octets</span><br><span style="color: hsl(120, 100%, 40%);">+*  \returns parsed bits on success, negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_gsm48_rest_octets_si13_decode(struct osmo_gsm48_si13_info *si13, const uint8_t *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_gprs_cell_options *co = &si13->cell_opts;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_gprs_power_ctrl_pars *pcp = &si13->pwr_ctrl_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct bitvec bv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(&bv, 0, sizeof(bv));</span><br><span style="color: hsl(120, 100%, 40%);">+       bv.data = (uint8_t *) data;</span><br><span style="color: hsl(120, 100%, 40%);">+   bv.data_len = 20;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(si13, 0, sizeof(*si13));</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%);">+   if (bitvec_get_bit_high(&bv) == H) {</span><br><span style="color: hsl(120, 100%, 40%);">+              si13->bcch_change_mark = bitvec_get_uint(&bv, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+              si13->si_change_field = bitvec_get_uint(&bv, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (bitvec_get_uint(&bv, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    si13->bcch_change_mark = bitvec_get_uint(&bv, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* FIXME: implement parsing GPRS Mobile Allocation IE */</span><br><span style="color: hsl(120, 100%, 40%);">+                      return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bitvec_get_uint(&bv, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* PBCCH present in cell */</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* FIXME: parse not implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+                    return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* PBCCH not present in cell */</span><br><span style="color: hsl(120, 100%, 40%);">+                       si13->rac = bitvec_get_uint(&bv, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+                   si13->spgc_ccch_sup = bitvec_get_uint(&bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                 si13->prio_acc_thr = bitvec_get_uint(&bv, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+                  si13->net_ctrl_ord = bitvec_get_uint(&bv, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+                  decode_gprs_cell_opt(co, &bv);</span><br><span style="color: hsl(120, 100%, 40%);">+                    decode_gprs_pwr_ctrl_pars(pcp, &bv);</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%);">+     return bv.cur_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* GPRS Mobile Allocation as per TS 04.60 Chapter 12.10a:</span><br><span>    < GPRS Mobile Allocation IE > ::=</span><br><span>      < HSN : bit (6) ></span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index efa23e6..0ea0678 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -320,6 +320,7 @@</span><br><span> osmo_gsm48_rest_octets_si6_encode;</span><br><span> osmo_gsm48_rest_octets_si3_encode;</span><br><span> osmo_gsm48_rest_octets_si4_encode;</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_gsm48_rest_octets_si13_decode;</span><br><span> osmo_gsm48_rest_octets_si13_encode;</span><br><span> osmo_gsm48_rest_octets_si3_decode;</span><br><span> osmo_gsm48_rest_octets_si4_decode;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22800">change 22800</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/libosmocore/+/22800"/><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-Change-Id: I74fb0a3afc1ac4aadbfc609b882d929401f790eb </div>
<div style="display:none"> Gerrit-Change-Number: 22800 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>