<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/14236">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;">rest_octets: Add function to parse SI3 rest octets<br><br>Change-Id: I690cf308311f910005a325d50f5d5d825678d2b2<br>Related: OS#3075<br>Related: OS#4023<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, 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_rest_octets.h b/include/osmocom/gsm/gsm48_rest_octets.h</span><br><span>index 3029ac5..bc5023a 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>@@ -87,3 +87,6 @@</span><br><span> </span><br><span> /* Generate SI13 Rest Octests (Chapter 10.5.2.37b) */</span><br><span> int osmo_gsm48_rest_octets_si13_encode(uint8_t *data, const struct osmo_gsm48_si13_info *si13);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Parse SI3 Rest Octets */</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_gsm48_rest_octets_si3_decode(struct osmo_gsm48_si_ro_info *si3, const uint8_t *data);</span><br><span>diff --git a/src/gsm/gsm48_rest_octets.c b/src/gsm/gsm48_rest_octets.c</span><br><span>index b9d5275..d5c93fe 100644</span><br><span>--- a/src/gsm/gsm48_rest_octets.c</span><br><span>+++ b/src/gsm/gsm48_rest_octets.c</span><br><span>@@ -951,3 +951,81 @@</span><br><span>     bitvec_spare_padding(&bv, (bv.data_len*8)-1);</span><br><span>    return bv.data_len;</span><br><span> }</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%);">+ * Decoder</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 SI3 Rest Octests (Chapter 10.5.2.34 / Table 10.4.72).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] si3 decoded SI3 rest octets</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] encoded SI3 rest octets, 4 octets long */</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_gsm48_rest_octets_si3_decode(struct osmo_gsm48_si_ro_info *si3, const uint8_t *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_gsm48_si_selection_params *sp = &si3->selection_params;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_gsm48_si_power_offset *po = &si3->power_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_gsm48_si3_gprs_ind *gi = &si3->gprs_ind;</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 = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    memset(si3, 0, sizeof(*si3));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Optional Selection Paraosmo_gsm48_si_ro_infometers */</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%);">+              sp->present = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           sp->cbq = bitvec_get_uint(&bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+             sp->cell_resel_off = bitvec_get_uint(&bv, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+          sp->temp_offs = bitvec_get_uint(&bv, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+               sp->penalty_time = bitvec_get_uint(&bv, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else</span><br><span style="color: hsl(120, 100%, 40%);">+                sp->present = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Optional Power Offset */</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%);">+              po->present = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           po->power_offset = bitvec_get_uint(&bv, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else</span><br><span style="color: hsl(120, 100%, 40%);">+                po->present = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* System Information 2ter Indicator */</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%);">+                si3->si2ter_indicator = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          si3->si2ter_indicator = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Early Classmark Sending Control */</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%);">+                si3->early_cm_ctrl = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          si3->early_cm_ctrl = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Scheduling if and where */</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%);">+              si3->scheduling.present = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               si3->scheduling.where = bitvec_get_uint(&bv, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else</span><br><span style="color: hsl(120, 100%, 40%);">+                si3->scheduling.present = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* GPRS Indicator */</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%);">+              gi->present = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           gi->ra_colour = bitvec_get_uint(&bv, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+               gi->si13_position = bitvec_get_uint(&bv, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else</span><br><span style="color: hsl(120, 100%, 40%);">+                gi->present = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 3G Early Classmark Sending Restriction. If H, then controlled by</span><br><span style="color: hsl(120, 100%, 40%);">+    * early_cm_ctrl above */</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%);">+                si3->early_cm_restrict_3g = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          si3->early_cm_restrict_3g = 0;</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%);">+                si3->si2quater_indicator = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          si3->si2quater_indicator = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index 56fed0f..84d71e6 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -309,6 +309,7 @@</span><br><span> osmo_gsm48_rest_octets_si3_encode;</span><br><span> osmo_gsm48_rest_octets_si4_encode;</span><br><span> osmo_gsm48_rest_octets_si13_encode;</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_gsm48_rest_octets_si3_decode;</span><br><span> gsm48_rr_msg_name;</span><br><span> gsm48_cc_state_name;</span><br><span> gsm48_construct_ra;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14236">change 14236</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/14236"/><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: I690cf308311f910005a325d50f5d5d825678d2b2 </div>
<div style="display:none"> Gerrit-Change-Number: 14236 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>