<p>Max <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12017">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Pau Espin Pedrol: Looks good to me, but someone else must approve
  Stefan Sperling: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">msgb: add test helpers<br><br>It's often handy to compare certain msgb layer to a given array and<br>print the position where they differ. Add simple pretty-printer and<br>corresponding L* wrappers.<br><br>Change-Id: I3bc95f2f5ab6e3f4b502647fb3e0aaaf1f7c4cf5<br>---<br>M include/osmocom/core/msgb.h<br>M src/msgb.c<br>2 files changed, 231 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/msgb.h b/include/osmocom/core/msgb.h</span><br><span>index 1bb5fe5..b7c8422 100644</span><br><span>--- a/include/osmocom/core/msgb.h</span><br><span>+++ b/include/osmocom/core/msgb.h</span><br><span>@@ -560,6 +560,145 @@</span><br><span>   return lbound <= msg->head +  msg->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%);">+/* msgb data comparison helpers */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare: check data in msgb against given data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_data(msg, data, len)                         \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 0, msg, data, len, false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare: check L1 data in msgb against given data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L1 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L1 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l1_data(msg, data, len)                         \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 1, msg, data, len, false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare: check L2 data in msgb against given data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L2 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L2 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l2_data(msg, data, len)                         \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 2, msg, data, len, false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare: check L3 data in msgb against given data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L3 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L3 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l3_data(msg, data, len)                         \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 3, msg, data, len, false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare: check L4 data in msgb against given data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L4 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L4 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l4_data(msg, data, len)                         \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 4, msg, data, len, 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%);">+/* msgb test/debug helpers */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check data in msgb against given data and print errors if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_data_print(msg, data, len)                          \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 0, msg, data, len, true)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check L1 data in msgb against given data and print errors if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L1 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L1 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l1_data_print(msg, data, len)                          \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 1, msg, data, len, true)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check L2 data in msgb against given data and print errors if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L2 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L2 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l2_data_print(msg, data, len)                          \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 2, msg, data, len, true)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check L3 data in msgb against given data and print errors if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L3 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L3 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l3_data_print(msg, data, len)                          \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 3, msg, data, len, 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%);">+/*! Compare and print: check L4 data in msgb against given data and print errors if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected L4 data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L4 content is equal to the given data</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l4_data_print(msg, data, len)                                \</span><br><span style="color: hsl(120, 100%, 40%);">+     _msgb_eq(__FILE__, __LINE__, __func__, 4, msg, data, len, true)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool _msgb_eq(const char *file, size_t line, const char *func, uint8_t level,</span><br><span style="color: hsl(120, 100%, 40%);">+            const struct msgb *msg, const uint8_t *data, size_t len, bool print);</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%);">+/* msgb data comparison */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare msgbs</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg1 message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg2 reference message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb content is equal</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq(msg1, msgb2, len) msgb_eq_data(msg1, msgb_data(msg2), msgb_length(msg2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare msgbs L1 content</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg1 message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg2 reference message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L1 content is equal</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l1(msg1, msgb2, len) msgb_eq_l1_data(msg1, msgb_l1(msg2), msgb_l1len(msg2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare msgbs L2 content</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg1 message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg2 reference message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L2 content is equal</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l2(msg1, msgb2, len) msgb_eq_l2_data(msg1, msgb_l2(msg2), msgb_l2len(msg2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare msgbs L3 content</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg1 message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg2 reference message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L3 content is equal</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l3(msg1, msgb2, len) msgb_eq_l3_data(msg1, msgb_l3(msg2), msgb_l3len(msg2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare msgbs L4 content</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg1 message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg2 reference message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb L4 content is equal</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define msgb_eq_l4(msg1, msgb2, len) msgb_eq_l4_data(msg1, msgb_l4(msg2), msgb_l4len(msg2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* non inline functions to ease binding */</span><br><span> </span><br><span> uint8_t *msgb_data(const struct msgb *msg);</span><br><span>diff --git a/src/msgb.c b/src/msgb.c</span><br><span>index 844cfc6..9cd59c6 100644</span><br><span>--- a/src/msgb.c</span><br><span>+++ b/src/msgb.c</span><br><span>@@ -173,6 +173,98 @@</span><br><span>    return msg->data;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compare and print: check data in msgb against given data and print errors if any</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] file text prefix, usually __FILE__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] line numeric prefix, usually __LINE__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] func text prefix, usually __func__, ignored if print == false</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] level while layer (L1, L2 etc) data should be compared against</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] msg message buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data expected data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len length of data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] print boolean indicating whether we should print anything to stdout</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns boolean indicating whether msgb content is equal to a given data</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function is not intended to be called directly but rather used through corresponding macro wrappers.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+bool _msgb_eq(const char *file, size_t line, const char *func, uint8_t level,</span><br><span style="color: hsl(120, 100%, 40%);">+           const struct msgb *msg, const uint8_t *data, size_t len, bool print)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *m_dump;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int m_len, i;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t *m_data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPSRC(DLGLOBAL, LOGL_FATAL, file, line, "%s() NULL msg comparison\n", func);</span><br><span style="color: hsl(120, 100%, 40%);">+              return 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%);">+   if (!data) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPSRC(DLGLOBAL, LOGL_FATAL, file, line, "%s() NULL comparison data\n", func);</span><br><span style="color: hsl(120, 100%, 40%);">+             return 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%);">+   switch (level) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+               m_len = msgb_length(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+             m_data = msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+              m_dump = print ? msgb_hexdump(msg) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+               m_len = msgb_l1len(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+              m_data = msgb_l1(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                m_dump = print ? msgb_hexdump_l1(msg) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+               m_len = msgb_l2len(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+              m_data = msgb_l2(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                m_dump = print ? msgb_hexdump_l2(msg) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+               m_len = msgb_l3len(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+              m_data = msgb_l3(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                m_dump = print ? msgb_hexdump_l3(msg) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+               m_len = msgb_l4len(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+              m_data = msgb_l4(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                m_dump = print ? msgb_hexdump_l4(msg) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPSRC(DLGLOBAL, LOGL_FATAL, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "%s() FIXME: unexpected comparison level %u\n", func, level);</span><br><span style="color: hsl(120, 100%, 40%);">+               return 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%);">+   if (m_len != len) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (print)</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPSRC(DLGLOBAL, LOGL_FATAL, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "%s() Length mismatch: %d != %zu, %s\n", func, m_len, len, m_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+         return 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%);">+   if (memcmp(m_data, data, len) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!print)</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGPSRC(DLGLOBAL, LOGL_FATAL, file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+             "%s() L%u data mismatch:\nexpected %s\n         ", func, level, osmo_hexdump(data, len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for(i = 0; i < len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           if (data[i] != m_data[i]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGPC(DLGLOBAL, LOGL_FATAL, "!!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPC(DLGLOBAL, LOGL_FATAL, ".. ");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGPC(DLGLOBAL, LOGL_FATAL, "    msgb %s\n", m_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! get length of message buffer</span><br><span>  *  \param[in] msg message buffer</span><br><span>  *  \returns length of data section in message buffer</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12017">change 12017</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/12017"/><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: I3bc95f2f5ab6e3f4b502647fb3e0aaaf1f7c4cf5 </div>
<div style="display:none"> Gerrit-Change-Number: 12017 </div>
<div style="display:none"> Gerrit-PatchSet: 14 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <stsp@stsp.name> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>