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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cbsp: Introduce osmo_cbsp_errstr<br><br>Rather than having the encoder/decoder library print some log<br>messages in case of encoding/decoding errors, let's provide something<br>akin to 'errno', but with a string instead of a numeric error code.<br><br>The 'osmo_cbsp_errstr' global variable (if set) contains a<br>human-readable string describing the most recent encoding/decoding error.<br><br>It exists separately for each thread and hence can be used safely in<br>multi-threaded environments.<br><br>Change-Id: Id9a5a595a76ba278647aee9470ded213d8464103<br>---<br>M include/osmocom/gsm/cbsp.h<br>M src/gsm/cbsp.c<br>M src/gsm/libosmogsm.map<br>3 files changed, 102 insertions(+), 28 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/cbsp.h b/include/osmocom/gsm/cbsp.h</span><br><span>index d47b37b..90516cb 100644</span><br><span>--- a/include/osmocom/gsm/cbsp.h</span><br><span>+++ b/include/osmocom/gsm/cbsp.h</span><br><span>@@ -283,6 +283,8 @@</span><br><span>     } u;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern const __thread char *osmo_cbsp_errstr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct msgb *osmo_cbsp_msgb_alloc(void *ctx, const char *name);</span><br><span> struct msgb *osmo_cbsp_encode(void *ctx, const struct osmo_cbsp_decoded *in);</span><br><span> struct osmo_cbsp_decoded *osmo_cbsp_decode(void *ctx, struct msgb *in);</span><br><span>diff --git a/src/gsm/cbsp.c b/src/gsm/cbsp.c</span><br><span>index a891c52..23f68de 100644</span><br><span>--- a/src/gsm/cbsp.c</span><br><span>+++ b/src/gsm/cbsp.c</span><br><span>@@ -33,6 +33,8 @@</span><br><span> #include <osmocom/gsm/cbsp.h></span><br><span> #include <osmocom/gsm/gsm0808_utils.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const __thread char *osmo_cbsp_errstr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct msgb *osmo_cbsp_msgb_alloc(void *ctx, const char *name)</span><br><span> {</span><br><span>  /* make the messages rather large as the cell lists can be long! */</span><br><span>@@ -134,6 +136,7 @@</span><br><span>            return (secs-120)/10;</span><br><span>        if (secs <= 60*60)</span><br><span>                return (secs-600)/30;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_cbsp_errstr = "warning period out of range";</span><br><span>  return -1;</span><br><span> }</span><br><span> </span><br><span>@@ -152,8 +155,10 @@</span><br><span>   if (in->is_cbs) {</span><br><span>                 int num_of_pages = llist_count(&in->u.cbs.msg_content);</span><br><span>               struct osmo_cbsp_content *ce;</span><br><span style="color: hsl(0, 100%, 40%);">-           if (num_of_pages == 0 || num_of_pages > 15)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (num_of_pages == 0 || num_of_pages > 15) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_cbsp_errstr = "invalid number of pages";</span><br><span>                      return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>            msgb_tv_put(msg, CBSP_IEI_CHANNEL_IND, in->u.cbs.channel_ind);</span><br><span>            msgb_tv_put(msg, CBSP_IEI_CATEGORY, in->u.cbs.category);</span><br><span>          msgb_tv16_put(msg, CBSP_IEI_REP_PERIOD, in->u.cbs.rep_period);</span><br><span>@@ -395,6 +400,8 @@</span><br><span>      unsigned int len;</span><br><span>    int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_cbsp_errstr = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (!msg)</span><br><span>            return NULL;</span><br><span> </span><br><span>@@ -462,9 +469,11 @@</span><br><span>      case CBSP_MSGT_SET_DRX:</span><br><span>      case CBSP_MSGT_SET_DRX_COMPL:</span><br><span>        case CBSP_MSGT_SET_DRX_FAIL:</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_cbsp_errstr = "message type not implemented";</span><br><span>                 rc = -1;</span><br><span>             break;</span><br><span>       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_cbsp_errstr = "message type not known in spec";</span><br><span>               rc = -1;</span><br><span>             break;</span><br><span>       }</span><br><span>@@ -502,8 +511,10 @@</span><br><span>             unsigned int len_remain = len - (cur - buf);</span><br><span>                 OSMO_ASSERT(ent);</span><br><span>            rc = gsm0808_decode_cell_id_u(&ent->cell_id, cl->id_discr, cur, len_remain);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_cbsp_errstr = "cell list: error decoding cell_id_union";</span><br><span>                      return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>            cur += rc;</span><br><span>           llist_add_tail(&ent->list, &cl->list);</span><br><span>         }</span><br><span>@@ -523,8 +534,10 @@</span><br><span>             OSMO_ASSERT(ent);</span><br><span>            ent->id_discr = cur[0];</span><br><span>           rc = gsm0808_decode_cell_id_u(&ent->cell_id, ent->id_discr, cur+1, len_remain-1);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_cbsp_errstr = "fail list: error decoding cell_id_union";</span><br><span>                      return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>            cur += rc;</span><br><span>           ent->cause = *cur++;</span><br><span>              llist_add_tail(&ent->list, fl);</span><br><span>@@ -545,11 +558,14 @@</span><br><span>               unsigned int len_remain = len - (cur - buf);</span><br><span>                 OSMO_ASSERT(ent);</span><br><span>            rc = gsm0808_decode_cell_id_u(&ent->cell_id, ll->id_discr, cur, len_remain);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_cbsp_errstr = "load list: error decoding cell_id_union";</span><br><span>                      return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>            cur += rc;</span><br><span>           if (cur + 2 > buf + len) {</span><br><span>                        talloc_free(ent);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_cbsp_errstr = "load list: truncated IE";</span><br><span>                      return -EINVAL;</span><br><span>              }</span><br><span>            ent->load[0] = *cur++;</span><br><span>@@ -572,11 +588,14 @@</span><br><span>            unsigned int len_remain = len - (cur - buf);</span><br><span>                 OSMO_ASSERT(ent);</span><br><span>            rc = gsm0808_decode_cell_id_u(&ent->cell_id, cl->id_discr, cur, len_remain);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_cbsp_errstr = "completed list: error decoding cell_id_union";</span><br><span>                         return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>            cur += rc;</span><br><span>           if (cur + 3 > buf + len) {</span><br><span>                        talloc_free(ent);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_cbsp_errstr = "completed list: truncated IE";</span><br><span>                         return -EINVAL;</span><br><span>              }</span><br><span>            ent->num_compl = osmo_load16be(cur); cur += 2;</span><br><span>@@ -619,8 +638,10 @@</span><br><span>     /* check for mandatory IEs */</span><br><span>        if (!TLVP_PRESENT(tp, CBSP_IEI_MSG_ID) ||</span><br><span>        !TLVP_PRESENT(tp, CBSP_IEI_NEW_SERIAL_NR) ||</span><br><span style="color: hsl(0, 100%, 40%);">-            !TLVP_PRESENT(tp, CBSP_IEI_CELL_LIST))</span><br><span style="color: hsl(120, 100%, 40%);">+        !TLVP_PRESENT(tp, CBSP_IEI_CELL_LIST)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->new_serial_nr = tlvp_val16be(tp, CBSP_IEI_NEW_SERIAL_NR);</span><br><span>@@ -636,14 +657,18 @@</span><br><span>    if (TLVP_PRESENT(tp, CBSP_IEI_CHANNEL_IND)) {</span><br><span>                uint8_t num_of_pages;</span><br><span>                INIT_LLIST_HEAD(&out->u.cbs.msg_content);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (TLVP_PRESENT(tp, CBSP_IEI_EMERG_IND))</span><br><span style="color: hsl(120, 100%, 40%);">+             if (TLVP_PRESENT(tp, CBSP_IEI_EMERG_IND)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>                   return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>            if (!TLVP_PRESENT(tp, CBSP_IEI_CATEGORY) ||</span><br><span>              !TLVP_PRESENT(tp, CBSP_IEI_REP_PERIOD) ||</span><br><span>                    !TLVP_PRESENT(tp, CBSP_IEI_NUM_BCAST_REQ) ||</span><br><span>                 !TLVP_PRESENT(tp, CBSP_IEI_NUM_OF_PAGES) ||</span><br><span style="color: hsl(0, 100%, 40%);">-             !TLVP_PRESENT(tp, CBSP_IEI_DCS))</span><br><span style="color: hsl(120, 100%, 40%);">+              !TLVP_PRESENT(tp, CBSP_IEI_DCS)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>                   return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>            out->is_cbs = true;</span><br><span>               out->u.cbs.channel_ind = *TLVP_VAL(tp, CBSP_IEI_CHANNEL_IND);</span><br><span>             out->u.cbs.category = *TLVP_VAL(tp, CBSP_IEI_CATEGORY);</span><br><span>@@ -656,8 +681,10 @@</span><br><span>            for (i = 0; i < num_of_pages; i++) {</span><br><span>                      const uint8_t *ie = TLVP_VAL(&tp[i], CBSP_IEI_MSG_CONTENT);</span><br><span>                      struct osmo_cbsp_content *page;</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!ie)</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (!ie) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            osmo_cbsp_errstr = "insufficient message content IEs";</span><br><span>                             return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span>                    page = talloc_zero(ctx, struct osmo_cbsp_content);</span><br><span>                   OSMO_ASSERT(page);</span><br><span>                   page->user_len = *(ie-1); /* length byte before payload */</span><br><span>@@ -668,8 +695,10 @@</span><br><span>                 if (!TLVP_PRES_LEN(tp, CBSP_IEI_EMERG_IND, 1) ||</span><br><span>                 !TLVP_PRES_LEN(tp, CBSP_IEI_WARN_TYPE, 2) ||</span><br><span>                 !TLVP_PRES_LEN(tp, CBSP_IEI_WARN_SEC_INFO, 50) ||</span><br><span style="color: hsl(0, 100%, 40%);">-               !TLVP_PRES_LEN(tp, CBSP_IEI_WARNING_PERIOD, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+               !TLVP_PRES_LEN(tp, CBSP_IEI_WARNING_PERIOD, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>                   return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>            out->u.emergency.indicator = *TLVP_VAL(tp, CBSP_IEI_EMERG_IND);</span><br><span>           out->u.emergency.warning_type = tlvp_val16be(tp, CBSP_IEI_WARN_TYPE);</span><br><span>             memcpy(&out->u.emergency.warning_sec_info, TLVP_VAL(tp, CBSP_IEI_WARN_SEC_INFO),</span><br><span>@@ -684,8 +713,10 @@</span><br><span>                                    const struct tlv_parsed *tp, struct msgb *in, void *ctx)</span><br><span> {</span><br><span>   if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span style="color: hsl(0, 100%, 40%);">-       !TLVP_PRES_LEN(tp, CBSP_IEI_NEW_SERIAL_NR, 2))</span><br><span style="color: hsl(120, 100%, 40%);">+        !TLVP_PRES_LEN(tp, CBSP_IEI_NEW_SERIAL_NR, 2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->new_serial_nr = tlvp_val16be(tp, CBSP_IEI_NEW_SERIAL_NR);</span><br><span>@@ -718,8 +749,10 @@</span><br><span> {</span><br><span>        if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_NEW_SERIAL_NR, 2) ||</span><br><span style="color: hsl(0, 100%, 40%);">-        !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5))</span><br><span style="color: hsl(120, 100%, 40%);">+         !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->new_serial_nr = tlvp_val16be(tp, CBSP_IEI_NEW_SERIAL_NR);</span><br><span>@@ -759,8 +792,11 @@</span><br><span> {</span><br><span>        if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||</span><br><span style="color: hsl(0, 100%, 40%);">-        !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+            !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);</span><br><span> </span><br><span>@@ -781,8 +817,10 @@</span><br><span> {</span><br><span>    if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||</span><br><span style="color: hsl(0, 100%, 40%);">-        !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+            !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);</span><br><span>@@ -811,8 +849,10 @@</span><br><span> {</span><br><span>        if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||</span><br><span style="color: hsl(0, 100%, 40%);">-        !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5))</span><br><span style="color: hsl(120, 100%, 40%);">+         !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);</span><br><span>@@ -847,8 +887,10 @@</span><br><span>                             struct msgb *in, void *ctx)</span><br><span> {</span><br><span>     if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1) ||</span><br><span style="color: hsl(0, 100%, 40%);">-            !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+          !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->cell_list.list);</span><br><span>        cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),</span><br><span>@@ -863,8 +905,10 @@</span><br><span>                               const struct tlv_parsed *tp, struct msgb *in, void *ctx)</span><br><span> {</span><br><span>   if (!TLVP_PRES_LEN(tp, CBSP_IEI_RR_LOADING_LIST, 6) ||</span><br><span style="color: hsl(0, 100%, 40%);">-      !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+          !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->loading_list.list);</span><br><span>     cbsp_decode_loading_list(&out->loading_list, ctx,</span><br><span>@@ -880,8 +924,10 @@</span><br><span>                                  const struct tlv_parsed *tp, struct msgb *in, void *ctx)</span><br><span> {</span><br><span>    if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5) ||</span><br><span style="color: hsl(0, 100%, 40%);">-         !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+          !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->fail_list);</span><br><span>     cbsp_decode_fail_list(&out->fail_list, ctx,</span><br><span>@@ -906,8 +952,11 @@</span><br><span>    if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||</span><br><span>             !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1) ||</span><br><span style="color: hsl(0, 100%, 40%);">-            !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+          !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);</span><br><span> </span><br><span>@@ -926,8 +975,10 @@</span><br><span>         if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||</span><br><span>             !TLVP_PRES_LEN(tp, CBSP_IEI_NUM_BCAST_COMPL_LIST, 7) ||</span><br><span style="color: hsl(0, 100%, 40%);">-         !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+          !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);</span><br><span>@@ -947,8 +998,10 @@</span><br><span>     if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||</span><br><span>            !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||</span><br><span>             !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5) ||</span><br><span style="color: hsl(0, 100%, 40%);">-         !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+          !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);</span><br><span>  out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);</span><br><span>@@ -973,8 +1026,10 @@</span><br><span> static int cbsp_dec_reset(struct osmo_cbsp_reset *out, const struct tlv_parsed *tp,</span><br><span>                       struct msgb *in, void *ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->cell_list.list);</span><br><span>        cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),</span><br><span>@@ -986,8 +1041,10 @@</span><br><span> static int cbsp_dec_reset_compl(struct osmo_cbsp_reset_complete *out, const struct tlv_parsed *tp,</span><br><span>                           struct msgb *in, void *ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->cell_list.list);</span><br><span>        cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),</span><br><span>@@ -999,8 +1056,10 @@</span><br><span> static int cbsp_dec_reset_fail(struct osmo_cbsp_reset_failure *out, const struct tlv_parsed *tp,</span><br><span>                             struct msgb *in, void *ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->fail_list);</span><br><span>     cbsp_decode_fail_list(&out->fail_list, ctx,</span><br><span>@@ -1019,8 +1078,10 @@</span><br><span> static int cbsp_dec_keep_alive(struct osmo_cbsp_keep_alive *out, const struct tlv_parsed *tp,</span><br><span>                                 struct msgb *in, void *ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!TLVP_PRES_LEN(tp, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!TLVP_PRES_LEN(tp, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->repetition_period = *TLVP_VAL(tp, CBSP_IEI_KEEP_ALIVE_REP_PERIOD);</span><br><span>   return 0;</span><br><span>@@ -1039,8 +1100,10 @@</span><br><span> {</span><br><span>      if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1) ||</span><br><span>         !TLVP_PRES_LEN(tp, CBSP_IEI_BCAST_MSG_TYPE, 1) ||</span><br><span style="color: hsl(0, 100%, 40%);">-       !TLVP_PRES_LEN(tp, CBSP_IEI_RECOVERY_IND, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+         !TLVP_PRES_LEN(tp, CBSP_IEI_RECOVERY_IND, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->cell_list.list);</span><br><span>        cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),</span><br><span>@@ -1056,8 +1119,10 @@</span><br><span>                            struct msgb *in, void *ctx)</span><br><span> {</span><br><span>         if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5) ||</span><br><span style="color: hsl(0, 100%, 40%);">-         !TLVP_PRES_LEN(tp, CBSP_IEI_BCAST_MSG_TYPE, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+       !TLVP_PRES_LEN(tp, CBSP_IEI_BCAST_MSG_TYPE, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&out->fail_list);</span><br><span>     cbsp_decode_fail_list(&out->fail_list, ctx,</span><br><span>@@ -1072,8 +1137,10 @@</span><br><span> static int cbsp_dec_error_ind(struct osmo_cbsp_error_ind *out, const struct tlv_parsed *tp,</span><br><span>                         struct msgb *in, void *ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!TLVP_PRES_LEN(tp, CBSP_IEI_CAUSE, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!TLVP_PRES_LEN(tp, CBSP_IEI_CAUSE, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_cbsp_errstr = "missing/short mandatory IE";</span><br><span>           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        out->cause = *TLVP_VAL(tp, CBSP_IEI_CAUSE);</span><br><span>       if (TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2)) {</span><br><span>@@ -1107,6 +1174,8 @@</span><br><span>         unsigned int len;</span><br><span>    int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_cbsp_errstr = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (!out)</span><br><span>            return NULL;</span><br><span> </span><br><span>@@ -1194,9 +1263,11 @@</span><br><span>    case CBSP_MSGT_SET_DRX:</span><br><span>      case CBSP_MSGT_SET_DRX_COMPL:</span><br><span>        case CBSP_MSGT_SET_DRX_FAIL:</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_cbsp_errstr = "message type not implemented";</span><br><span>                 rc = -1;</span><br><span>             break;</span><br><span>       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_cbsp_errstr = "message type not known in spec";</span><br><span>               rc = -1;</span><br><span>             break;</span><br><span>       }</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index eefcf61..ea1f759 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -656,6 +656,7 @@</span><br><span> osmo_cbsp_encode;</span><br><span> osmo_cbsp_decode;</span><br><span> osmo_cbsp_recv_buffered;</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_cbsp_errstr;</span><br><span> </span><br><span> local: *;</span><br><span> };</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/14478">change 14478</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/+/14478"/><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: Id9a5a595a76ba278647aee9470ded213d8464103 </div>
<div style="display:none"> Gerrit-Change-Number: 14478 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>