<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22800">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  daniel: Looks good to me, approved
  fixeria: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><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>M tests/Makefile.am<br>A tests/gsm48/rest_octets_test.c<br>A tests/gsm48/rest_octets_test.ok<br>M tests/testsuite.at<br>7 files changed, 249 insertions(+), 1 deletion(-)<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 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..77fd349 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,119 @@</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 unsigned 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%);">+    static const unsigned int decode_t3192_tbl[8] = {500, 1000, 1500, 0, 80, 120, 160, 200};</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(t3192 <= 7);</span><br><span style="color: hsl(120, 100%, 40%);">+   return decode_t3192_tbl[t3192];</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 unsigned 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%);">+       static const unsigned int decode_drx_timer_tbl[8] = {0, 1, 2, 4, 8, 16, 32, 64};</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(drx <= 7);</span><br><span style="color: hsl(120, 100%, 40%);">+     return decode_drx_timer_tbl[drx];</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_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%);">+         int ext_len = bitvec_get_uint(bv, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (ext_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   return ext_len;</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%);">+     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%);">+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%);">+     int rc;</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 -ENOTSUP;</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 -ENOTSUP;</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%);">+                  if ((rc = decode_gprs_cell_opt(co, &bv)) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                          return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</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>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 10306aa..158bc69 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -42,6 +42,7 @@</span><br><span>                  bsslap/bsslap_test                                     \</span><br><span>             bssmap_le/bssmap_le_test                               \</span><br><span>             it_q/it_q_test                                         \</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm48/rest_octets_test                                 \</span><br><span>             $(NULL)</span><br><span> </span><br><span> if ENABLE_MSGFILE</span><br><span>@@ -139,6 +140,9 @@</span><br><span> gsm0408_gsm0408_test_SOURCES = gsm0408/gsm0408_test.c</span><br><span> gsm0408_gsm0408_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+gsm48_rest_octets_test_SOURCES = gsm48/rest_octets_test.c</span><br><span style="color: hsl(120, 100%, 40%);">+gsm48_rest_octets_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> gprs_gprs_test_SOURCES = gprs/gprs_test.c</span><br><span> gprs_gprs_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la</span><br><span> </span><br><span>@@ -399,6 +403,7 @@</span><br><span>           bsslap/bsslap_test.ok \</span><br><span>              bssmap_le/bssmap_le_test.ok \</span><br><span>        it_q/it_q_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+           gsm48/rest_octets_test.ok \</span><br><span>          $(NULL)</span><br><span> </span><br><span> if ENABLE_LIBSCTP</span><br><span>diff --git a/tests/gsm48/rest_octets_test.c b/tests/gsm48/rest_octets_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..beff6e4</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gsm48/rest_octets_test.c</span><br><span>@@ -0,0 +1,120 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48_rest_octets.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct si13_test {</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct osmo_gsm48_si13_info si;</span><br><span style="color: hsl(120, 100%, 40%);">+ int enc_rc;</span><br><span style="color: hsl(120, 100%, 40%);">+   int dec_rc;</span><br><span style="color: hsl(120, 100%, 40%);">+   void (*post_dec_cb)(const struct si13_test *test, const struct osmo_gsm48_si13_info* dec);</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%);">+void post_dec_cb_test_alpha(const struct si13_test *test, const struct osmo_gsm48_si13_info* dec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(test->si.pwr_ctrl_pars.alpha == dec->pwr_ctrl_pars.alpha);</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 const struct si13_test test_si13_arr[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "test alpha",</span><br><span style="color: hsl(120, 100%, 40%);">+               .si = {</span><br><span style="color: hsl(120, 100%, 40%);">+                       .cell_opts = {</span><br><span style="color: hsl(120, 100%, 40%);">+                                .nmo            = GPRS_NMO_II,</span><br><span style="color: hsl(120, 100%, 40%);">+                                .t3168          = 2000,</span><br><span style="color: hsl(120, 100%, 40%);">+                               .t3192          = 1500,</span><br><span style="color: hsl(120, 100%, 40%);">+                               .drx_timer_max  = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .bs_cv_max      = 15,</span><br><span style="color: hsl(120, 100%, 40%);">+                         .ctrl_ack_type_use_block = true,</span><br><span style="color: hsl(120, 100%, 40%);">+                              .ext_info_present = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                .ext_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 .egprs_supported = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 .use_egprs_p_ch_req = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      .bep_period = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      .pfc_supported = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   .dtm_supported = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   .bss_paging_coordination = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 .ccn_active = true,</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%);">+                    .pwr_ctrl_pars = {</span><br><span style="color: hsl(120, 100%, 40%);">+                            .alpha          = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .t_avg_w        = 16,</span><br><span style="color: hsl(120, 100%, 40%);">+                         .t_avg_t        = 16,</span><br><span style="color: hsl(120, 100%, 40%);">+                         .pc_meas_chan   = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .n_avg_i        = 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                  },</span><br><span style="color: hsl(120, 100%, 40%);">+                    .bcch_change_mark       = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .si_change_field        = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .rac            = 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .spgc_ccch_sup  = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .net_ctrl_ord   = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .prio_acc_thr   = 6,</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            .enc_rc = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+         .dec_rc = 71,</span><br><span style="color: hsl(120, 100%, 40%);">+         .post_dec_cb = post_dec_cb_test_alpha,</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 test_si13()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int i, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t data[GSM_MACBLOCK_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_gsm48_si13_info si13;</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_si13_arr); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          memset(data, 0, sizeof(data));</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = osmo_gsm48_rest_octets_si13_encode(data, &test_si13_arr[i].si);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (rc >= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     printf("si13_encode (%d): %s\n", rc, osmo_hexdump(data, rc));</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf("si13_encode failed (%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_ASSERT(rc == test_si13_arr[i].enc_rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (rc <= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                       continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             memset(&si13, 0 , sizeof(si13));</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = osmo_gsm48_rest_octets_si13_decode(&si13, data);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (rc >= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     printf("si13_decode (%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf("si13_decode failed (%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_ASSERT(rc == test_si13_arr[i].dec_rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (test_si13_arr[i].post_dec_cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   test_si13_arr[i].post_dec_cb(&test_si13_arr[i], &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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    test_si13();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return EXIT_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/gsm48/rest_octets_test.ok b/tests/gsm48/rest_octets_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..54204f2</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gsm48/rest_octets_test.ok</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+si13_encode (20): 90 00 d8 5a 6f c9 e5 84 10 ab 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b </span><br><span style="color: hsl(120, 100%, 40%);">+si13_decode (71)</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index d715a3e..d2a10dd 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -156,6 +156,12 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/gsm0408/gsm0408_test], [0], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([gsm48_rest_octets])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([gsm48_rest_octets])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/gsm48/rest_octets_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/gsm48/rest_octets_test], [0], [expout], [ignore])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AT_SETUP([gprs])</span><br><span> AT_KEYWORDS([gprs])</span><br><span> cat $abs_srcdir/gprs/gprs_test.ok > expout</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: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>