Change in ...libosmocore[master]: cbsp: Introduce osmo_cbsp_errstr

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

laforge gerrit-no-reply at lists.osmocom.org
Sun Jun 16 08:57:32 UTC 2019


laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/14478


Change subject: cbsp: Introduce osmo_cbsp_errstr
......................................................................

cbsp: Introduce osmo_cbsp_errstr

Rather than having the encoder/decoder library print some log
messages in case of encoding/decoding errors, let's provide something
akin to 'errno', but with a string instead of a numeric error code.

The 'osmo_cbsp_errstr' global variable (if set) contains a
human-readable string describing the most recent encoding/decoding error.

It exists separately for each thread and hence can be used safely in
multi-threaded environments.

Change-Id: Id9a5a595a76ba278647aee9470ded213d8464103
---
M include/osmocom/gsm/cbsp.h
M src/gsm/cbsp.c
M src/gsm/libosmogsm.map
3 files changed, 102 insertions(+), 28 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/78/14478/1

diff --git a/include/osmocom/gsm/cbsp.h b/include/osmocom/gsm/cbsp.h
index 7e5cc64..6be60eb 100644
--- a/include/osmocom/gsm/cbsp.h
+++ b/include/osmocom/gsm/cbsp.h
@@ -258,6 +258,8 @@
 	} u;
 };
 
+extern const __thread char *osmo_cbsp_errstr;
+
 struct msgb *osmo_cbsp_msgb_alloc(void *ctx, const char *name);
 struct msgb *osmo_cbsp_encode(void *ctx, const struct osmo_cbsp_decoded *in);
 struct osmo_cbsp_decoded *osmo_cbsp_decode(void *ctx, struct msgb *in);
diff --git a/src/gsm/cbsp.c b/src/gsm/cbsp.c
index f371500..0311f56 100644
--- a/src/gsm/cbsp.c
+++ b/src/gsm/cbsp.c
@@ -32,6 +32,8 @@
 #include <osmocom/gsm/cbsp.h>
 #include <osmocom/gsm/gsm0808_utils.h>
 
+const __thread char *osmo_cbsp_errstr;
+
 struct msgb *osmo_cbsp_msgb_alloc(void *ctx, const char *name)
 {
 	/* make the messages rather large as the cell lists can be long! */
@@ -133,6 +135,7 @@
 		return (secs-120)/10;
 	if (secs <= 60*60)
 		return (secs-600)/30;
+	osmo_cbsp_errstr = "warning period out of range";
 	return -1;
 }
 
@@ -151,8 +154,10 @@
 	if (in->is_cbs) {
 		int num_of_pages = llist_count(&in->u.cbs.msg_content);
 		struct osmo_cbsp_content *ce;
-		if (num_of_pages == 0 || num_of_pages > 15)
+		if (num_of_pages == 0 || num_of_pages > 15) {
+			osmo_cbsp_errstr = "invalid number of pages";
 			return -EINVAL;
+		}
 		msgb_tv_put(msg, CBSP_IEI_CHANNEL_IND, in->u.cbs.channel_ind);
 		msgb_tv_put(msg, CBSP_IEI_CATEGORY, in->u.cbs.category);
 		msgb_tv16_put(msg, CBSP_IEI_REP_PERIOD, in->u.cbs.rep_period);
@@ -383,6 +388,8 @@
 	unsigned int len;
 	int rc;
 
+	osmo_cbsp_errstr = NULL;
+
 	if (!msg)
 		return NULL;
 
@@ -450,9 +457,11 @@
 	case CBSP_MSGT_SET_DRX:
 	case CBSP_MSGT_SET_DRX_COMPL:
 	case CBSP_MSGT_SET_DRX_FAIL:
+		osmo_cbsp_errstr = "message type not implemented";
 		rc = -1;
 		break;
 	default:
+		osmo_cbsp_errstr = "message type not known in spec";
 		rc = -1;
 		break;
 	}
@@ -490,8 +499,10 @@
 		unsigned int len_remain = len - (cur - buf);
 		OSMO_ASSERT(ent);
 		rc = gsm0808_decode_cell_id_u(&ent->cell_id, cl->id_discr, cur, len_remain);
-		if (rc < 0)
+		if (rc < 0) {
+			osmo_cbsp_errstr = "cell list: error decoding cell_id_union";
 			return rc;
+		}
 		cur += rc;
 		llist_add_tail(&ent->list, &cl->list);
 	}
@@ -511,8 +522,10 @@
 		OSMO_ASSERT(ent);
 		ent->id_discr = cur[0];
 		rc = gsm0808_decode_cell_id_u(&ent->cell_id, ent->id_discr, cur+1, len_remain-1);
-		if (rc < 0)
+		if (rc < 0) {
+			osmo_cbsp_errstr = "fail list: error decoding cell_id_union";
 			return rc;
+		}
 		cur += rc;
 		ent->cause = *cur++;
 		llist_add_tail(&ent->list, fl);
@@ -533,11 +546,14 @@
 		unsigned int len_remain = len - (cur - buf);
 		OSMO_ASSERT(ent);
 		rc = gsm0808_decode_cell_id_u(&ent->cell_id, ll->id_discr, cur, len_remain);
-		if (rc < 0)
+		if (rc < 0) {
+			osmo_cbsp_errstr = "load list: error decoding cell_id_union";
 			return rc;
+		}
 		cur += rc;
 		if (cur + 2 > buf + len) {
 			talloc_free(ent);
+			osmo_cbsp_errstr = "load list: truncated IE";
 			return -EINVAL;
 		}
 		ent->load[0] = *cur++;
@@ -560,11 +576,14 @@
 		unsigned int len_remain = len - (cur - buf);
 		OSMO_ASSERT(ent);
 		rc = gsm0808_decode_cell_id_u(&ent->cell_id, cl->id_discr, cur, len_remain);
-		if (rc < 0)
+		if (rc < 0) {
+			osmo_cbsp_errstr = "completed list: error decoding cell_id_union";
 			return rc;
+		}
 		cur += rc;
 		if (cur + 3 > buf + len) {
 			talloc_free(ent);
+			osmo_cbsp_errstr = "completed list: truncated IE";
 			return -EINVAL;
 		}
 		ent->num_compl = osmo_load16be(cur); cur += 2;
@@ -607,8 +626,10 @@
 	/* check for mandatory IEs */
 	if (!TLVP_PRESENT(tp, CBSP_IEI_MSG_ID) ||
 	    !TLVP_PRESENT(tp, CBSP_IEI_NEW_SERIAL_NR) ||
-	    !TLVP_PRESENT(tp, CBSP_IEI_CELL_LIST))
+	    !TLVP_PRESENT(tp, CBSP_IEI_CELL_LIST)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->new_serial_nr = tlvp_val16be(tp, CBSP_IEI_NEW_SERIAL_NR);
@@ -624,14 +645,18 @@
 	if (TLVP_PRESENT(tp, CBSP_IEI_CHANNEL_IND)) {
 		uint8_t num_of_pages;
 		INIT_LLIST_HEAD(&out->u.cbs.msg_content);
-		if (TLVP_PRESENT(tp, CBSP_IEI_EMERG_IND))
+		if (TLVP_PRESENT(tp, CBSP_IEI_EMERG_IND)) {
+			osmo_cbsp_errstr = "missing/short mandatory IE";
 			return -EINVAL;
+		}
 		if (!TLVP_PRESENT(tp, CBSP_IEI_CATEGORY) ||
 		    !TLVP_PRESENT(tp, CBSP_IEI_REP_PERIOD) ||
 		    !TLVP_PRESENT(tp, CBSP_IEI_NUM_BCAST_REQ) ||
 		    !TLVP_PRESENT(tp, CBSP_IEI_NUM_OF_PAGES) ||
-		    !TLVP_PRESENT(tp, CBSP_IEI_DCS))
+		    !TLVP_PRESENT(tp, CBSP_IEI_DCS)) {
+			osmo_cbsp_errstr = "missing/short mandatory IE";
 			return -EINVAL;
+		}
 		out->is_cbs = true;
 		out->u.cbs.channel_ind = *TLVP_VAL(tp, CBSP_IEI_CHANNEL_IND);
 		out->u.cbs.category = *TLVP_VAL(tp, CBSP_IEI_CATEGORY);
@@ -644,8 +669,10 @@
 		for (i = 0; i < num_of_pages; i++) {
 			const uint8_t *ie = TLVP_VAL(&tp[i], CBSP_IEI_MSG_CONTENT);
 			struct osmo_cbsp_content *page;
-			if (!ie)
+			if (!ie) {
+				osmo_cbsp_errstr = "insufficient message content IEs";
 				return -EINVAL;
+			}
 			page = talloc_zero(ctx, struct osmo_cbsp_content);
 			OSMO_ASSERT(page);
 			page->user_len = *(ie-1); /* length byte before payload */
@@ -656,8 +683,10 @@
 		if (!TLVP_PRES_LEN(tp, CBSP_IEI_EMERG_IND, 1) ||
 		    !TLVP_PRES_LEN(tp, CBSP_IEI_WARN_TYPE, 2) ||
 		    !TLVP_PRES_LEN(tp, CBSP_IEI_WARN_SEC_INFO, 50) ||
-		    !TLVP_PRES_LEN(tp, CBSP_IEI_WARNING_PERIOD, 1))
+		    !TLVP_PRES_LEN(tp, CBSP_IEI_WARNING_PERIOD, 1)) {
+			osmo_cbsp_errstr = "missing/short mandatory IE";
 			return -EINVAL;
+		}
 		out->u.emergency.indicator = *TLVP_VAL(tp, CBSP_IEI_EMERG_IND);
 		out->u.emergency.warning_type = tlvp_val16be(tp, CBSP_IEI_WARN_TYPE);
 		memcpy(&out->u.emergency.warning_sec_info, TLVP_VAL(tp, CBSP_IEI_WARN_SEC_INFO),
@@ -672,8 +701,10 @@
 				     const struct tlv_parsed *tp, struct msgb *in, void *ctx)
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_NEW_SERIAL_NR, 2))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_NEW_SERIAL_NR, 2)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->new_serial_nr = tlvp_val16be(tp, CBSP_IEI_NEW_SERIAL_NR);
@@ -706,8 +737,10 @@
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_NEW_SERIAL_NR, 2) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->new_serial_nr = tlvp_val16be(tp, CBSP_IEI_NEW_SERIAL_NR);
@@ -747,8 +780,11 @@
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
+
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);
 
@@ -769,8 +805,10 @@
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);
@@ -799,8 +837,10 @@
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);
@@ -835,8 +875,10 @@
 				struct msgb *in, void *ctx)
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->cell_list.list);
 	cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),
@@ -851,8 +893,10 @@
 				     const struct tlv_parsed *tp, struct msgb *in, void *ctx)
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_RR_LOADING_LIST, 6) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->loading_list.list);
 	cbsp_decode_loading_list(&out->loading_list, ctx,
@@ -868,8 +912,10 @@
 				    const struct tlv_parsed *tp, struct msgb *in, void *ctx)
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->fail_list);
 	cbsp_decode_fail_list(&out->fail_list, ctx,
@@ -894,8 +940,11 @@
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
+
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);
 
@@ -914,8 +963,10 @@
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_NUM_BCAST_COMPL_LIST, 7) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);
@@ -935,8 +986,10 @@
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_OLD_SERIAL_NR, 2) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_CHANNEL_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->msg_id = tlvp_val16be(tp, CBSP_IEI_MSG_ID);
 	out->old_serial_nr = tlvp_val16be(tp, CBSP_IEI_OLD_SERIAL_NR);
@@ -961,8 +1014,10 @@
 static int cbsp_dec_reset(struct osmo_cbsp_reset *out, const struct tlv_parsed *tp,
 			  struct msgb *in, void *ctx)
 {
-	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))
+	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->cell_list.list);
 	cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),
@@ -974,8 +1029,10 @@
 static int cbsp_dec_reset_compl(struct osmo_cbsp_reset_complete *out, const struct tlv_parsed *tp,
 				struct msgb *in, void *ctx)
 {
-	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1))
+	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->cell_list.list);
 	cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),
@@ -987,8 +1044,10 @@
 static int cbsp_dec_reset_fail(struct osmo_cbsp_reset_failure *out, const struct tlv_parsed *tp,
 				struct msgb *in, void *ctx)
 {
-	if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5))
+	if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->fail_list);
 	cbsp_decode_fail_list(&out->fail_list, ctx,
@@ -1007,8 +1066,10 @@
 static int cbsp_dec_keep_alive(struct osmo_cbsp_keep_alive *out, const struct tlv_parsed *tp,
 				struct msgb *in, void *ctx)
 {
-	if (!TLVP_PRES_LEN(tp, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, 1))
+	if (!TLVP_PRES_LEN(tp, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->repetition_period = *TLVP_VAL(tp, CBSP_IEI_KEEP_ALIVE_REP_PERIOD);
 	return 0;
@@ -1027,8 +1088,10 @@
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CELL_LIST, 1) ||
 	    !TLVP_PRES_LEN(tp, CBSP_IEI_BCAST_MSG_TYPE, 1) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_RECOVERY_IND, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_RECOVERY_IND, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->cell_list.list);
 	cbsp_decode_cell_list(&out->cell_list, ctx, TLVP_VAL(tp, CBSP_IEI_CELL_LIST),
@@ -1044,8 +1107,10 @@
 			    struct msgb *in, void *ctx)
 {
 	if (!TLVP_PRES_LEN(tp, CBSP_IEI_FAILURE_LIST, 5) ||
-	    !TLVP_PRES_LEN(tp, CBSP_IEI_BCAST_MSG_TYPE, 1))
+	    !TLVP_PRES_LEN(tp, CBSP_IEI_BCAST_MSG_TYPE, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	INIT_LLIST_HEAD(&out->fail_list);
 	cbsp_decode_fail_list(&out->fail_list, ctx,
@@ -1060,8 +1125,10 @@
 static int cbsp_dec_error_ind(struct osmo_cbsp_error_ind *out, const struct tlv_parsed *tp,
 			      struct msgb *in, void *ctx)
 {
-	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CAUSE, 1))
+	if (!TLVP_PRES_LEN(tp, CBSP_IEI_CAUSE, 1)) {
+		osmo_cbsp_errstr = "missing/short mandatory IE";
 		return -EINVAL;
+	}
 
 	out->cause = *TLVP_VAL(tp, CBSP_IEI_CAUSE);
 	if (TLVP_PRES_LEN(tp, CBSP_IEI_MSG_ID, 2)) {
@@ -1095,6 +1162,8 @@
 	unsigned int len;
 	int rc;
 
+	osmo_cbsp_errstr = NULL;
+
 	if (!out)
 		return NULL;
 
@@ -1182,9 +1251,11 @@
 	case CBSP_MSGT_SET_DRX:
 	case CBSP_MSGT_SET_DRX_COMPL:
 	case CBSP_MSGT_SET_DRX_FAIL:
+		osmo_cbsp_errstr = "message type not implemented";
 		rc = -1;
 		break;
 	default:
+		osmo_cbsp_errstr = "message type not known in spec";
 		rc = -1;
 		break;
 	}
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index eefcf61..ea1f759 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -656,6 +656,7 @@
 osmo_cbsp_encode;
 osmo_cbsp_decode;
 osmo_cbsp_recv_buffered;
+osmo_cbsp_errstr;
 
 local: *;
 };

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/14478
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Id9a5a595a76ba278647aee9470ded213d8464103
Gerrit-Change-Number: 14478
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at gnumonks.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190616/b5898d4f/attachment.htm>


More information about the gerrit-log mailing list