<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12573">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add function to combine nibbles into byte<br><br>It's a very common patter throughout GSM 04.08 and other protocols where<br>single byte store 2 different values occupying 1 nibble each.<br><br>Change-Id: I380687c31a787c0a109819f7c3b2946eae52675e<br>---<br>M include/osmocom/core/bits.h<br>M include/osmocom/gsm/gsm0808_utils.h<br>M include/osmocom/gsm/gsm48.h<br>M include/osmocom/gsm/protocol/gsm_03_41.h<br>M src/gsm/gsm0808.c<br>M src/gsm/gsm23003.c<br>M src/gsm/gsm48.c<br>M tests/utils/utils_test.c<br>8 files changed, 21 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/73/12573/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/bits.h b/include/osmocom/core/bits.h</span><br><span>index b1b8040..8027bdd 100644</span><br><span>--- a/include/osmocom/core/bits.h</span><br><span>+++ b/include/osmocom/core/bits.h</span><br><span>@@ -47,6 +47,16 @@</span><br><span> </span><br><span> int osmo_pbit2ubit(ubit_t *out, const pbit_t *in, unsigned int num_bits);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Nibble combination.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] lo Value to be placed in LSB nibble</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] hi Value to be placed in LSB nibble</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns combined nibble value</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline uint8_t osmo_nibble(uint8_t lo, uint8_t hi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return lo | (hi << 4);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void osmo_nibble_shift_right(uint8_t *out, const uint8_t *in,</span><br><span>                        unsigned int num_nibbles);</span><br><span> void osmo_nibble_shift_left_unal(uint8_t *out, const uint8_t *in,</span><br><span>diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>index 4a2233e..4cc917b 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808_utils.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>@@ -237,7 +237,7 @@</span><br><span>          return 0;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return channel_mode << 4 | channel;</span><br><span style="color: hsl(120, 100%, 40%);">+     return osmo_nibble(channel, channel_mode);</span><br><span> }</span><br><span> </span><br><span> const char *gsm0808_channel_type_name(const struct gsm0808_channel_type *ct);</span><br><span>diff --git a/include/osmocom/gsm/gsm48.h b/include/osmocom/gsm/gsm48.h</span><br><span>index 0f5727a..69b2eeb 100644</span><br><span>--- a/include/osmocom/gsm/gsm48.h</span><br><span>+++ b/include/osmocom/gsm/gsm48.h</span><br><span>@@ -71,4 +71,4 @@</span><br><span>                               uint8_t pdisc, uint8_t msg_type);</span><br><span> </span><br><span> #define gsm48_push_l3hdr_tid(msg, pdisc, tid, msg_type) \</span><br><span style="color: hsl(0, 100%, 40%);">-   gsm48_push_l3hdr(msg, (pdisc & 0x0f) | (tid << 4), msg_type)</span><br><span style="color: hsl(120, 100%, 40%);">+        gsm48_push_l3hdr(msg, osmo_nibble(pdisc & 0x0f, tid), msg_type)</span><br><span>diff --git a/include/osmocom/gsm/protocol/gsm_03_41.h b/include/osmocom/gsm/protocol/gsm_03_41.h</span><br><span>index 1b399ae..cd84fd4 100644</span><br><span>--- a/include/osmocom/gsm/protocol/gsm_03_41.h</span><br><span>+++ b/include/osmocom/gsm/protocol/gsm_03_41.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span> </span><br><span> #include <stdint.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bits.h></span><br><span> #include <osmocom/core/endian.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_12.h></span><br><span> </span><br><span>@@ -73,7 +74,7 @@</span><br><span>         uint8_t data[0];</span><br><span> } __attribute__((packed));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM341_MSG_CODE(ms) ((ms)->serial.code_lo | ((ms)->serial.code_hi << 4))</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSM341_MSG_CODE(ms) osmo_nibble((ms)->serial.code_lo, (ms)->serial.code_hi)</span><br><span> </span><br><span> /* Section 9.3.2.1 - Geographical Scope */</span><br><span> #define GSM341_GS_CELL_WIDE_IMMED        0</span><br><span>diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c</span><br><span>index 59b1657..2254630 100644</span><br><span>--- a/src/gsm/gsm0808.c</span><br><span>+++ b/src/gsm/gsm0808.c</span><br><span>@@ -293,7 +293,7 @@</span><br><span>             return NULL;</span><br><span> </span><br><span>     /* Set cause code class in the upper byte */</span><br><span style="color: hsl(0, 100%, 40%);">-    cause = 0x80 | (class << 4);</span><br><span style="color: hsl(120, 100%, 40%);">+    cause = osmo_nibble(0x80, class);</span><br><span>    cause = cause << 8;</span><br><span> </span><br><span>        /* Set cause code extension in the lower byte */</span><br><span>diff --git a/src/gsm/gsm23003.c b/src/gsm/gsm23003.c</span><br><span>index 1d9cefe..eaf0fb4 100644</span><br><span>--- a/src/gsm/gsm23003.c</span><br><span>+++ b/src/gsm/gsm23003.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span> #include <osmocom/gsm/protocol/gsm_23_003.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bits.h></span><br><span> </span><br><span> static bool is_n_digits(const char *str, int min_digits, int max_digits)</span><br><span> {</span><br><span>@@ -218,10 +219,10 @@</span><br><span>       to_bcd(bcd, plmn->mnc);</span><br><span>   if (plmn->mnc > 99 || plmn->mnc_3_digits) {</span><br><span>                 bcd_dst[1] |= bcd[2] << 4;</span><br><span style="color: hsl(0, 100%, 40%);">-                bcd_dst[2] = bcd[0] | (bcd[1] << 4);</span><br><span style="color: hsl(120, 100%, 40%);">+            bcd_dst[2] = osmo_nibble(bcd[0], bcd[1]);</span><br><span>    } else {</span><br><span>             bcd_dst[1] |= 0xf << 4;</span><br><span style="color: hsl(0, 100%, 40%);">-           bcd_dst[2] = bcd[1] | (bcd[2] << 4);</span><br><span style="color: hsl(120, 100%, 40%);">+            bcd_dst[2] = osmo_nibble(bcd[1], bcd[2]);</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/gsm/gsm48.c b/src/gsm/gsm48.c</span><br><span>index 795e98b..e5d1592 100644</span><br><span>--- a/src/gsm/gsm48.c</span><br><span>+++ b/src/gsm/gsm48.c</span><br><span>@@ -659,7 +659,7 @@</span><br><span>            else</span><br><span>                         upper = osmo_char2bcd(id[++off]) & 0x0f;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                buf[2 + i] = (upper << 4) | lower;</span><br><span style="color: hsl(120, 100%, 40%);">+              buf[2 + i] = osmo_nibble(lower, upper);</span><br><span>      }</span><br><span> </span><br><span>        return 2 + buf[1];</span><br><span>diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c</span><br><span>index a773b3f..b677a5f 100644</span><br><span>--- a/tests/utils/utils_test.c</span><br><span>+++ b/tests/utils/utils_test.c</span><br><span>@@ -510,7 +510,7 @@</span><br><span>        in_buf[16] = '\0';</span><br><span>   for (j = 0; j < 16; j++) {</span><br><span>                for (i = 0; i < 16; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                     in_buf[i] = (j << 4) | i;</span><br><span style="color: hsl(120, 100%, 40%);">+                       in_buf[i] = osmo_nibble(i, j);</span><br><span>               printf("\"%s\"\n", osmo_escape_str((const char*)in_buf, 16));</span><br><span>    }</span><br><span> </span><br><span>@@ -558,7 +558,7 @@</span><br><span>  in_buf[16] = '\0';</span><br><span>   for (j = 0; j < 16; j++) {</span><br><span>                for (i = 0; i < 16; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                     in_buf[i] = (j << 4) | i;</span><br><span style="color: hsl(120, 100%, 40%);">+                       in_buf[i] = osmo_nibble(i, j);</span><br><span>               printf("'%s'\n", osmo_quote_str((const char*)in_buf, 16));</span><br><span>         }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12573">change 12573</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/12573"/><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: I380687c31a787c0a109819f7c3b2946eae52675e </div>
<div style="display:none"> Gerrit-Change-Number: 12573 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>