arehbein has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-netif/+/32709 )
Change subject: stream: Add client side recv and send for IPA ......................................................................
stream: Add client side recv and send for IPA
Related: OS#5753 Change-Id: Ic93b2d96fd14ad1a1dc063924498d87f0b1d8a56 --- M include/osmocom/netif/stream.h M src/stream.c 2 files changed, 79 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/09/32709/1
diff --git a/include/osmocom/netif/stream.h b/include/osmocom/netif/stream.h index cd1dd22..7f2c37e 100644 --- a/include/osmocom/netif/stream.h +++ b/include/osmocom/netif/stream.h @@ -4,6 +4,7 @@ #include <stdint.h>
#include <osmocom/core/msgb.h> +#include <osmocom/gsm/protocol/ipaccess.h>
/*! \addtogroup stream * @{ @@ -108,7 +109,11 @@ void osmo_stream_cli_close(struct osmo_stream_cli *cli);
void osmo_stream_cli_send(struct osmo_stream_cli *cli, struct msgb *msg); +void osmo_stream_cli_send_ipa(struct osmo_stream_cli *cli, enum ipaccess_proto p, + enum ipaccess_proto_ext pe, struct msgb *msg); int osmo_stream_cli_recv(struct osmo_stream_cli *cli, struct msgb *msg); +int osmo_stream_cli_recv_ipa(struct osmo_stream_cli *cli, enum ipaccess_proto p, + enum ipaccess_proto_ext pe, struct msgb *msg);
void osmo_stream_cli_clear_tx_queue(struct osmo_stream_cli *cli);
diff --git a/src/stream.c b/src/stream.c index d61a8d6..ac2dcec 100644 --- a/src/stream.c +++ b/src/stream.c @@ -37,6 +37,8 @@ #include <osmocom/core/utils.h> #include <osmocom/gsm/tlv.h> #include <osmocom/gsm/ipa.h> +#include <osmocom/netif/ipa.h> +#include <osmocom/gsm/protocol/ipaccess.h> #include <osmocom/core/msgb.h> #include <osmocom/core/osmo_io.h> #include <osmocom/core/panic.h> @@ -1155,6 +1157,23 @@ } }
+/*! \brief Enqueue IPA data to be sent via an Osmocom stream client + * \param[in] cli Stream client through which we want to send + * \param[in] p Protocol transported by IPA + * \param[in] pe Ignored, unless p == IPAC_PROTO_OSMO, in which case this specifies the + * Osmocom protocol extension + * \param[in] msg Message buffer to encapsulate as IPA (or possibly IPA + IPA extended + * enqueue in transmit queue) */ +void osmo_stream_cli_send_ipa(struct osmo_stream_cli *cli, enum ipaccess_proto p, + enum ipaccess_proto_ext pe, struct msgb *msg) +{ + OSMO_ASSERT(msg); + if (p == IPAC_PROTO_OSMO) + ipa_prepend_header_ext(msg, pe); + osmo_ipa_msg_push_header(msg, p); + osmo_stream_cli_send(cli, msg); +} + /*! \brief Receive data via an Osmocom stream client * \param[in] cli Stream Client through which we want to send * \param msg pre-allocate message buffer to which received data is appended @@ -1182,6 +1201,51 @@ return ret; }
+/*! \brief Receive IPA data via an Osmocom stream client + * \param[in] cli Stream Client through which we want to send + * \param[in] p Expected protocol to be transported by IPA + * \param[in] pe Ignored, unless p == IPAC_PROTO_OSMO, in which case this specifies the + * Osmocom protocol extension expected to be received + * \param msg pre-allocated message buffer to which received data is appended + * \returns number of bytes read; <=0 in case of error. */ +int osmo_stream_cli_recv_ipa(struct osmo_stream_cli *cli, enum ipaccess_proto p, + enum ipaccess_proto_ext pe, struct msgb *msg) +{ + struct ipa_head *ih; + struct ipa_head_ext *ihe; + size_t bytes; + int ret = osmo_stream_cli_recv(cli, msg); + if (ret <= 0) { + LOGSCLI(cli, LOGL_ERROR, "Couldn't receive IPA message\n"); + return ret; + } + bytes = ret; + if ((ret = osmo_ipa_process_msg(msg)) < 0) { + LOGSCLI(cli, LOGL_ERROR, "Error processing IPA message\n"); + return ret; + } + ih = (struct ipa_head *)msg->data; + if (ih->proto != p) { + LOGSCLI(cli, LOGL_ERROR, "Unexpected IPA protocol received: 0x%02x " + "(expected: 0x%02x)\n", ih->proto, p); + return -ENOMSG; + } + msgb_pull(msg, sizeof (struct ipa_head)); + msg->l1h = NULL; + if (ih->proto != IPAC_PROTO_OSMO) /* No extensions expected */ + return bytes; + + ihe = (struct ipa_head_ext *)msg; + if (ihe->proto != pe) { + LOGSCLI(cli, LOGL_ERROR, "Unexpected IPA Osmocom protocol extension " + "received: 0x%02x (expected: 0x%02x)\n", ihe->proto, pe); + return -ENOMSG; + } + msgb_pull(msg, sizeof (struct ipa_head_ext)); + msg->l2h = NULL; + return ret; +} + void osmo_stream_cli_clear_tx_queue(struct osmo_stream_cli *cli) { switch (cli->mode) {