<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/18506">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add TMSI and NRI utility functions for MSC pooling<br><br>These utilities will be used by osmo-bsc to determine the Network Resource<br>Indicator seen in the TMSI, and by osmo-msc to compose a TMSI with a specific<br>NRI, for osmo-bsc's load balancing between several MSCs.<br><br>Related: OS#3682<br>Change-Id: Icb57a2dd9323c7ea11b34003eccc7e68a0247bf5<br>---<br>M include/Makefile.am<br>A include/osmocom/gsm/gsm23236.h<br>M src/gsm/Makefile.am<br>A src/gsm/gsm23236.c<br>M src/gsm/libosmogsm.map<br>M tests/Makefile.am<br>A tests/gsm23236/gsm23236_test.c<br>A tests/gsm23236/gsm23236_test.ok<br>M tests/testsuite.at<br>9 files changed, 306 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/06/18506/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/Makefile.am b/include/Makefile.am</span><br><span>index 572c880..841e911 100644</span><br><span>--- a/include/Makefile.am</span><br><span>+++ b/include/Makefile.am</span><br><span>@@ -95,6 +95,7 @@</span><br><span>                        osmocom/gsm/gsm29205.h \</span><br><span>                        osmocom/gsm/gsm0808_utils.h \</span><br><span>                        osmocom/gsm/gsm23003.h \</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmocom/gsm/gsm23236.h \</span><br><span>                        osmocom/gsm/gsm29118.h \</span><br><span>                        osmocom/gsm/gsm48.h \</span><br><span>                        osmocom/gsm/gsm48_arfcn_range_encode.h \</span><br><span>diff --git a/include/osmocom/gsm/gsm23236.h b/include/osmocom/gsm/gsm23236.h</span><br><span>new file mode 100644</span><br><span>index 0000000..8cc58e0</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/gsm/gsm23236.h</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \file gsm23236.h */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_TMSI_UNASSIGNED 0xffffffff</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t osmo_tmsi_nri_get(uint32_t tmsi, uint8_t nri_bitlen);</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t osmo_tmsi_nri_set(uint32_t tmsi, uint8_t nri_bitcount, uint16_t v);</span><br><span>diff --git a/src/gsm/Makefile.am b/src/gsm/Makefile.am</span><br><span>index 6935eab..23d8324 100644</span><br><span>--- a/src/gsm/Makefile.am</span><br><span>+++ b/src/gsm/Makefile.am</span><br><span>@@ -31,7 +31,7 @@</span><br><span>                       milenage/aes-internal.c milenage/aes-internal-enc.c \</span><br><span>                        milenage/milenage.c gan.c ipa.c gsm0341.c apn.c \</span><br><span>                    gsup.c gsup_sms.c gprs_gea.c gsm0503_conv.c oap.c gsm0808_utils.c \</span><br><span style="color: hsl(0, 100%, 40%);">-                     gsm23003.c mncc.c bts_features.c oap_client.c \</span><br><span style="color: hsl(120, 100%, 40%);">+                       gsm23003.c gsm23236.c mncc.c bts_features.c oap_client.c \</span><br><span>                   gsm29118.c gsm48_rest_octets.c cbsp.c gsm48049.c</span><br><span> libgsmint_la_LDFLAGS = -no-undefined</span><br><span> libgsmint_la_LIBADD = $(top_builddir)/src/libosmocore.la</span><br><span>diff --git a/src/gsm/gsm23236.c b/src/gsm/gsm23236.c</span><br><span>new file mode 100644</span><br><span>index 0000000..02060a6</span><br><span>--- /dev/null</span><br><span>+++ b/src/gsm/gsm23236.c</span><br><span>@@ -0,0 +1,63 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \file gsm23236.c</span><br><span style="color: hsl(120, 100%, 40%);">+ * Utility function implementations related to 3GPP TS 23.236 */</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Neels Hofmeyr <nhofmeyr@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%);">+ * SPDX-License-Identifier: GPL-2.0+</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 <osmocom/gsm/gsm23236.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Retrieve the Network Resource Indicator bits from a TMSI or p-TMSI.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Useful for MSC pooling as described by 3GPP TS 23.236.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] tmsi  TMSI value containing NRI bits.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] nri_bitlen  Length of the NRI value in number of bits, 1 <= nri_bitlen <= 10.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return the nri_v (NRI value) read from tmsi, or -1 if nri_bitlen is not in the range [1..10].</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t osmo_tmsi_nri_get(uint32_t tmsi, uint8_t nri_bitlen)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* According to 3GPP TS 23.236, the most significant bit of the NRI is always bit 23.</span><br><span style="color: hsl(120, 100%, 40%);">+  * (So this is not a temporary placeholder 23 we sometimes like to use, it is an actually specified 23!) */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t lowest_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (nri_bitlen < 1 || nri_bitlen > 10)</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    lowest_bit = 23 - (nri_bitlen - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   return (tmsi >> lowest_bit) & (0xfff >> (12 - nri_bitlen));</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%);">+/*! Write Network Resource Indicator bits into a TMSI or p-TMSI.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Return a TMSI or p-TMSI with the NRI bits overwritten by the given NRI value.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Useful for MSC pooling as described by 3GPP TS 23.236.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] tmsi  A base TMSI or p-TMSI to replace the NRI value in.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] nri_bitlen  Length of the NRI value in number of bits, 1 <= nri_bitlen <= 10.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] nri_v  The NRI value to place in the tmsi.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return the original TMSI or p-TMSI with NRI bits replaced, or OSMO_TMSI_UNASSIGNED if nri_bitlen is not in the</span><br><span style="color: hsl(120, 100%, 40%);">+ *         range [1..10].</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t osmo_tmsi_nri_set(uint32_t tmsi, uint8_t nri_bitlen, uint16_t nri_v)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t lowest_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t v_mask;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (nri_bitlen < 1 || nri_bitlen > 10)</span><br><span style="color: hsl(120, 100%, 40%);">+          return OSMO_TMSI_UNASSIGNED;</span><br><span style="color: hsl(120, 100%, 40%);">+  lowest_bit = 23 - (nri_bitlen - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   v_mask = (0xfff >> (12 - nri_bitlen)) << lowest_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+      return (tmsi & ~v_mask) | ((((uint32_t)nri_v) << lowest_bit) & v_mask);</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 70b3916..98cdac5 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -667,5 +667,8 @@</span><br><span> osmo_cbsp_recv_buffered;</span><br><span> osmo_cbsp_errstr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_get;</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> local: *;</span><br><span> };</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 0d0327a..87bea8d 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -23,6 +23,7 @@</span><br><span>            coding/coding_test conv/conv_gsm0503_test              \</span><br><span>             abis/abis_test endian/endian_test sercomm/sercomm_test \</span><br><span>             prbs/prbs_test gsm23003/gsm23003_test                  \</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm23236/gsm23236_test                                 \</span><br><span>             codec/codec_ecu_fr_test timer/clk_override_test        \</span><br><span>             oap/oap_client_test gsm29205/gsm29205_test             \</span><br><span>             logging/logging_vty_test                               \</span><br><span>@@ -245,6 +246,9 @@</span><br><span> gsm23003_gsm23003_test_SOURCES = gsm23003/gsm23003_test.c</span><br><span> gsm23003_gsm23003_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+gsm23236_gsm23236_test_SOURCES = gsm23236/gsm23236_test.c</span><br><span style="color: hsl(120, 100%, 40%);">+gsm23236_gsm23236_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> tdef_tdef_test_SOURCES = tdef/tdef_test.c</span><br><span> tdef_tdef_test_LDADD = $(LDADD)</span><br><span> </span><br><span>@@ -332,6 +336,7 @@</span><br><span>           conv/conv_gsm0503_test.ok endian/endian_test.ok            \</span><br><span>         sercomm/sercomm_test.ok prbs/prbs_test.ok                  \</span><br><span>         gsm29205/gsm29205_test.ok gsm23003/gsm23003_test.ok        \</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm23236/gsm23236_test.ok                                  \</span><br><span>         timer/clk_override_test.ok                                 \</span><br><span>         oap/oap_client_test.ok oap/oap_client_test.err             \</span><br><span>         vty/vty_transcript_test.vty                                \</span><br><span>diff --git a/tests/gsm23236/gsm23236_test.c b/tests/gsm23236/gsm23236_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d6f6286</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gsm23236/gsm23236_test.c</span><br><span>@@ -0,0 +1,163 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Neels Hofmeyr <nhofmeyr@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%);">+ * SPDX-License-Identifier: GPL-2.0+</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 <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <strings.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm23236.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bitdump(uint8_t count, uint32_t val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t bit;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (bit = ((uint32_t)1) << (count - 1); bit; bit >>= 1)</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("%c", (val & bit)? '1' : '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%);">+struct nri_get_set_test {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t nri_bitlen;</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t expect_get_nri;</span><br><span style="color: hsl(120, 100%, 40%);">+       int16_t set_nri_v;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t expect_tmsi;</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%);">+struct nri_get_set_test nri_get_set_tests[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+             .tmsi = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .nri_bitlen = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_get_nri = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .set_nri_v = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_tmsi = 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%);">+             .tmsi = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .nri_bitlen = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_get_nri = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .set_nri_v = 0x7fff,</span><br><span style="color: hsl(120, 100%, 40%);">+          .expect_tmsi = 0x00ffc000</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%);">+             .tmsi = 0xffffffff,</span><br><span style="color: hsl(120, 100%, 40%);">+           .nri_bitlen = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_get_nri = 0x3ff,</span><br><span style="color: hsl(120, 100%, 40%);">+              .set_nri_v = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_tmsi = 0xff003fff</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%);">+             .tmsi = 0xffffffff,</span><br><span style="color: hsl(120, 100%, 40%);">+           .nri_bitlen = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_get_nri = 0x3ff,</span><br><span style="color: hsl(120, 100%, 40%);">+              .set_nri_v = 0x7fff,</span><br><span style="color: hsl(120, 100%, 40%);">+          .expect_tmsi = 0xffffffff</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%);">+             .tmsi = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .nri_bitlen = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_get_nri = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .set_nri_v = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_tmsi = 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%);">+             .tmsi = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .nri_bitlen = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_get_nri = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .set_nri_v = 0x7fff,</span><br><span style="color: hsl(120, 100%, 40%);">+          .expect_tmsi = 0x00f80000</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%);">+             .tmsi = 0xffffffff,</span><br><span style="color: hsl(120, 100%, 40%);">+           .nri_bitlen = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_get_nri = 0x1f,</span><br><span style="color: hsl(120, 100%, 40%);">+               .set_nri_v = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_tmsi = 0xff07ffff</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%);">+             .tmsi = 0xffffffff,</span><br><span style="color: hsl(120, 100%, 40%);">+           .nri_bitlen = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_get_nri = 0x1f,</span><br><span style="color: hsl(120, 100%, 40%);">+               .set_nri_v = 0x7fff,</span><br><span style="color: hsl(120, 100%, 40%);">+          .expect_tmsi = 0xffffffff</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%);">+             .tmsi = 0x01234567,</span><br><span style="color: hsl(120, 100%, 40%);">+           .nri_bitlen = 8,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_get_nri = 0x23,</span><br><span style="color: hsl(120, 100%, 40%);">+               .set_nri_v = 0x42,</span><br><span style="color: hsl(120, 100%, 40%);">+            .expect_tmsi = 0x01424567</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%);">+bool test_nri_get_set()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct nri_get_set_test *t;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool ok = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (t = nri_get_set_tests; t < &nri_get_set_tests[ARRAY_SIZE(nri_get_set_tests)]; t++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              int16_t nri_v;</span><br><span style="color: hsl(120, 100%, 40%);">+                uint32_t tmsi2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("........|NRI->..................\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            bitdump(32, t->tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+              printf(" tmsi  nri_bitlen=%u\n", t->nri_bitlen);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               nri_v = osmo_tmsi_nri_get(t->tmsi, t->nri_bitlen);</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("        ");</span><br><span style="color: hsl(120, 100%, 40%);">+         bitdump(t->nri_bitlen, nri_v);</span><br><span style="color: hsl(120, 100%, 40%);">+             printf(" = 0x%x", nri_v);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (nri_v == t->expect_get_nri) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf(" ok\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf(" ERROR: expected %x\n", t->expect_get_nri);</span><br><span style="color: hsl(120, 100%, 40%);">+                      ok = false;</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%);">+           tmsi2 = osmo_tmsi_nri_set(t->tmsi, t->nri_bitlen, t->set_nri_v);</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("osmo_tmsi_nri_set(0x%08x, %u, 0x%x) = 0x%08x\n", t->tmsi, t->nri_bitlen, t->set_nri_v, tmsi2);</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("        ");</span><br><span style="color: hsl(120, 100%, 40%);">+         bitdump(t->nri_bitlen, t->set_nri_v);</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               bitdump(32, tmsi2);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tmsi2 == t->expect_tmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     printf(" ok\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf(" ERROR: expected 0x%08x\n", t->expect_tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                     ok = false;</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%);">+   return ok;</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%);">+   bool pass = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   pass = pass && test_nri_get_set();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(pass);</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/gsm23236/gsm23236_test.ok b/tests/gsm23236/gsm23236_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..3fb6ce1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gsm23236/gsm23236_test.ok</span><br><span>@@ -0,0 +1,54 @@</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+00000000000000000000000000000000 tmsi  nri_bitlen=10</span><br><span style="color: hsl(120, 100%, 40%);">+        0000000000 = 0x0 ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0x00000000, 10, 0x0) = 0x00000000</span><br><span style="color: hsl(120, 100%, 40%);">+        0000000000</span><br><span style="color: hsl(120, 100%, 40%);">+00000000000000000000000000000000 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+00000000000000000000000000000000 tmsi  nri_bitlen=10</span><br><span style="color: hsl(120, 100%, 40%);">+        0000000000 = 0x0 ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0x00000000, 10, 0x7fff) = 0x00ffc000</span><br><span style="color: hsl(120, 100%, 40%);">+        1111111111</span><br><span style="color: hsl(120, 100%, 40%);">+00000000111111111100000000000000 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+11111111111111111111111111111111 tmsi  nri_bitlen=10</span><br><span style="color: hsl(120, 100%, 40%);">+        1111111111 = 0x3ff ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0xffffffff, 10, 0x0) = 0xff003fff</span><br><span style="color: hsl(120, 100%, 40%);">+        0000000000</span><br><span style="color: hsl(120, 100%, 40%);">+11111111000000000011111111111111 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+11111111111111111111111111111111 tmsi  nri_bitlen=10</span><br><span style="color: hsl(120, 100%, 40%);">+        1111111111 = 0x3ff ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0xffffffff, 10, 0x7fff) = 0xffffffff</span><br><span style="color: hsl(120, 100%, 40%);">+        1111111111</span><br><span style="color: hsl(120, 100%, 40%);">+11111111111111111111111111111111 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+00000000000000000000000000000000 tmsi  nri_bitlen=5</span><br><span style="color: hsl(120, 100%, 40%);">+        00000 = 0x0 ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0x00000000, 5, 0x0) = 0x00000000</span><br><span style="color: hsl(120, 100%, 40%);">+        00000</span><br><span style="color: hsl(120, 100%, 40%);">+00000000000000000000000000000000 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+00000000000000000000000000000000 tmsi  nri_bitlen=5</span><br><span style="color: hsl(120, 100%, 40%);">+        00000 = 0x0 ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0x00000000, 5, 0x7fff) = 0x00f80000</span><br><span style="color: hsl(120, 100%, 40%);">+        11111</span><br><span style="color: hsl(120, 100%, 40%);">+00000000111110000000000000000000 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+11111111111111111111111111111111 tmsi  nri_bitlen=5</span><br><span style="color: hsl(120, 100%, 40%);">+        11111 = 0x1f ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0xffffffff, 5, 0x0) = 0xff07ffff</span><br><span style="color: hsl(120, 100%, 40%);">+        00000</span><br><span style="color: hsl(120, 100%, 40%);">+11111111000001111111111111111111 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+11111111111111111111111111111111 tmsi  nri_bitlen=5</span><br><span style="color: hsl(120, 100%, 40%);">+        11111 = 0x1f ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0xffffffff, 5, 0x7fff) = 0xffffffff</span><br><span style="color: hsl(120, 100%, 40%);">+        11111</span><br><span style="color: hsl(120, 100%, 40%);">+11111111111111111111111111111111 ok</span><br><span style="color: hsl(120, 100%, 40%);">+........|NRI->..................</span><br><span style="color: hsl(120, 100%, 40%);">+00000001001000110100010101100111 tmsi  nri_bitlen=8</span><br><span style="color: hsl(120, 100%, 40%);">+        00100011 = 0x23 ok</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_tmsi_nri_set(0x01234567, 8, 0x42) = 0x01424567</span><br><span style="color: hsl(120, 100%, 40%);">+        01000010</span><br><span style="color: hsl(120, 100%, 40%);">+00000001010000100100010101100111 ok</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index bab5730..c580578 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -344,6 +344,12 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/gsm23003/gsm23003_test], [0], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([gsm23236])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([gsm23236])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/gsm23236/gsm23236_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/gsm23236/gsm23236_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([tdef])</span><br><span> AT_KEYWORDS([tdef])</span><br><span> cat $abs_srcdir/tdef/tdef_test.ok > expout</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/18506">change 18506</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/+/18506"/><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: Icb57a2dd9323c7ea11b34003eccc7e68a0247bf5 </div>
<div style="display:none"> Gerrit-Change-Number: 18506 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>