arehbein has submitted this change. ( 
https://gerrit.osmocom.org/c/libosmocore/+/33083 )

Change subject: gsm/ipa: Add segmentation callback
......................................................................

gsm/ipa: Add segmentation callback

Add segmentation callback to be used by the streaming backend of libosmo-netif

Related: OS#5753, OS#5751
Change-Id: I3a639e6896cc3b3fc8e9b2e1a58254710efa0d3f
---
M include/osmocom/gsm/ipa.h
M src/gsm/ipa.c
M src/gsm/libosmogsm.map
3 files changed, 45 insertions(+), 0 deletions(-)

Approvals:
  daniel: Looks good to me, approved
  fixeria: Looks good to me, but someone else must approve
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified




diff --git a/include/osmocom/gsm/ipa.h b/include/osmocom/gsm/ipa.h
index 851b58e..8a4dd3f 100644
--- a/include/osmocom/gsm/ipa.h
+++ b/include/osmocom/gsm/ipa.h
@@ -79,3 +79,6 @@

 int ipa_msg_recv(int fd, struct msgb **rmsg);
 int ipa_msg_recv_buffered(int fd, struct msgb **rmsg, struct msgb **tmp_msg);
+
+/* Callback for segmenting TCP stream data into IPA packets */
+int ipa_segmentation_cb(struct msgb *msg);
diff --git a/src/gsm/ipa.c b/src/gsm/ipa.c
index 447e8e3..93e34df 100644
--- a/src/gsm/ipa.c
+++ b/src/gsm/ipa.c
@@ -30,6 +30,7 @@
 #include <stdint.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <inttypes.h>

 #include <sys/types.h>

@@ -718,4 +719,32 @@
        return nmsg;
 }

+/*! Segmentation callback used by libosmo-netif streaming backend
+ *  See definition of `struct osmo_io_ops` for callback semantics
+ *  \param[in] msg     Original `struct msgb` received via osmo_io
+ *  \returns           The total packet length indicated by the first header,
+ *                     otherwise
+ *                     -EAGAIN,  if the header has not been read yet,
+ *                     -ENOBUFS, if the header declares a payload too large
+ */
+int ipa_segmentation_cb(struct msgb *msg)
+{
+       const struct ipaccess_head *hh = (const struct ipaccess_head *) 
msg->data;
+       size_t payload_len, total_len;
+       size_t available = msgb_length(msg) + msgb_tailroom(msg);
+       if (msgb_length(msg) < sizeof(*hh)) {
+               /* Haven't even read the entire header */
+               return -EAGAIN;
+       }
+       payload_len = osmo_ntohs(hh->len);
+       total_len = sizeof(*hh) + payload_len;
+       if (OSMO_UNLIKELY(available < total_len)) {
+               LOGP(DLINP, LOGL_ERROR, "Not enough space left in message 
buffer. "
+                                       "Have %zu octets, but need %zu\n",
+                                       available, total_len);
+               return -ENOBUFS;
+       }
+       return total_len;
+}
+
 /*! @} */
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index 29bf94f..1e5a7b2 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -689,6 +689,7 @@
 ipa_ccm_id_resp_parse;
 ipa_ccm_make_id_resp;
 ipa_ccm_make_id_resp_from_req;
+ipa_segmentation_cb;
 ipa_msg_alloc;
 ipa_msg_recv;
 ipa_msg_recv_buffered;

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

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I3a639e6896cc3b3fc8e9b2e1a58254710efa0d3f
Gerrit-Change-Number: 33083
Gerrit-PatchSet: 12
Gerrit-Owner: arehbein <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: arehbein <[email protected]>
Gerrit-Reviewer: daniel <[email protected]>
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to