laforge has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/36145?usp=email )
Change subject: cbsp: Add osmo_cbsp_segmentation_cb for message segmentation ......................................................................
cbsp: Add osmo_cbsp_segmentation_cb for message segmentation
This call-back can for example be used as segmentation call-back for libosmo-netif stream_cli/stream_srv or directly for osmo_io.
Related: OS#5755 Change-Id: I5e922c54b3431d759b38e81e55076125c5a34008 --- M include/osmocom/gsm/cbsp.h M src/gsm/cbsp.c M src/gsm/libosmogsm.map 3 files changed, 35 insertions(+), 0 deletions(-)
Approvals: fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved Jenkins Builder: Verified
diff --git a/include/osmocom/gsm/cbsp.h b/include/osmocom/gsm/cbsp.h index 536c54d..efa4ce6 100644 --- a/include/osmocom/gsm/cbsp.h +++ b/include/osmocom/gsm/cbsp.h @@ -312,3 +312,4 @@ struct osmo_cbsp_decoded *osmo_cbsp_decoded_alloc(void *ctx, enum cbsp_msg_type msg_type);
int osmo_cbsp_recv_buffered(void *ctx, int fd, struct msgb **rmsg, struct msgb **tmp_msg); +int osmo_cbsp_segmentation_cb(struct msgb *msg); diff --git a/src/gsm/cbsp.c b/src/gsm/cbsp.c index 28852f6..a5e58f4 100644 --- a/src/gsm/cbsp.c +++ b/src/gsm/cbsp.c @@ -1567,6 +1567,26 @@ return rc; }
+/*! call-back function to segment the data at message boundaries. + * Returns the size of the next message. If it returns -EAGAIN or a value larger than msgb_length() (message + * is incomplete), the caller (e.g. osmo_io) has to wait for more data to be read. */ +int osmo_cbsp_segmentation_cb(struct msgb *msg) +{ + const struct cbsp_header *h; + int len; + + if (msgb_length(msg) < sizeof(*h)) + return -EAGAIN; + + h = (const struct cbsp_header *) msg->data; + msg->l1h = msg->data; + msg->l2h = msg->data + sizeof(*h); + /* then read the length as specified in the header */ + len = h->len[0] << 16 | h->len[1] << 8 | h->len[2]; + + return sizeof(*h) + len; +} + /*! value_string[] for enum osmo_cbsp_cause. */ const struct value_string osmo_cbsp_cause_names[] = { { OSMO_CBSP_CAUSE_PARAM_NOT_RECOGNISED, "Parameter-not-recognised" }, diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index db2dbcb..2c4c621 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -793,6 +793,7 @@ osmo_cbsp_decode; osmo_cbsp_recv_buffered; osmo_cbsp_errstr; +osmo_cbsp_segmentation_cb;
osmo_i460_demux_in; osmo_i460_mux_enqueue;