pespin submitted this change.
ipa: Split msgb generation into its own helper function
This allows having a clearer picture when comparing against other
protocol stacks like M3UA and SUA, since both have a sua_to_msg() and
m3ua_to_msg() functions (which in turn call xua_to_msg()).
This way ipa_tx_xua_as() also becomes much more similar to
m3ua_tx_xua_as() and sua_tx_xua_as().
While at it, also add extra logging to m3ua/sua_tx_xua_as() to also
provide AS context logging information when encoding fail.
Change-Id: Ic0a405ab4d1811efea137167dcb08c9308a4d7e7
---
M src/ipa.c
M src/m3ua.c
M src/sua.c
3 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/src/ipa.c b/src/ipa.c
index d62d710..6ca5b50 100644
--- a/src/ipa.c
+++ b/src/ipa.c
@@ -52,12 +52,7 @@
#include "ss7_internal.h"
#include "xua_asp_fsm.h"
-
-/*! \brief Send a given xUA message via a given IPA "Application Server"
- * \param[in] as Application Server through which to send \a xua
- * \param[in] xua xUA message to be sent
- * \return 0 on success; negative on error */
-int ipa_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua)
+static struct msgb *ipa_to_msg(struct xua_msg *xua)
{
struct xua_msg_part *data_ie;
struct m3ua_data_hdr *data_hdr;
@@ -66,18 +61,16 @@
const uint8_t *src;
uint8_t *dst;
- OSMO_ASSERT(as->cfg.proto == OSMO_SS7_ASP_PROT_IPA);
-
/* we're actually only interested in the data part */
data_ie = xua_msg_find_tag(xua, M3UA_IEI_PROT_DATA);
if (!data_ie || data_ie->len < sizeof(struct m3ua_data_hdr))
- return -1;
+ return NULL;
data_hdr = (struct m3ua_data_hdr *) data_ie->dat;
if (data_hdr->si != MTP_SI_SCCP) {
- LOGPAS(as, DLSS7, LOGL_ERROR, "Cannot transmit non-SCCP SI (%u) to IPA peer\n",
- data_hdr->si);
- return -1;
+ LOGP(DLSS7, LOGL_ERROR, "Cannot transmit non-SCCP SI (%u) to IPA peer\n",
+ data_hdr->si);
+ return NULL;
}
/* and even the data part still has the header prepended */
@@ -87,7 +80,7 @@
/* sufficient headroom for osmo_ipa_msg_push_header() */
msg = ipa_msg_alloc(16);
if (!msg)
- return -1;
+ return NULL;
dst = msgb_put(msg, src_len);
memcpy(dst, src, src_len);
@@ -95,6 +88,23 @@
/* TODO: if we ever need something beyond SCCP, we can use the
* M3UA SIO to determine the protocol */
osmo_ipa_msg_push_header(msg, IPAC_PROTO_SCCP);
+ return msg;
+}
+
+/*! \brief Send a given xUA message via a given IPA "Application Server"
+ * \param[in] as Application Server through which to send \a xua
+ * \param[in] xua xUA message to be sent
+ * \return 0 on success; negative on error */
+int ipa_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua)
+{
+ struct msgb *msg;
+ OSMO_ASSERT(as->cfg.proto == OSMO_SS7_ASP_PROT_IPA);
+
+ msg = ipa_to_msg(xua);
+ if (!msg) {
+ LOGPAS(as, DLSS7, LOGL_ERROR, "Error encoding IPA Msg\n");
+ return -1;
+ }
return xua_as_transmit_msg(as, msg);
}
diff --git a/src/m3ua.c b/src/m3ua.c
index be1f167..5f94674 100644
--- a/src/m3ua.c
+++ b/src/m3ua.c
@@ -522,8 +522,10 @@
xua_msg_add_u32(xua, M3UA_IEI_ROUTE_CTX, as->cfg.routing_key.context);
msg = m3ua_to_msg(xua);
- if (!msg)
+ if (!msg) {
+ LOGPAS(as, DLM3UA, LOGL_ERROR, "Error encoding M3UA Msg\n");
return -1;
+ }
/* send the msg to the AS for transmission. The AS FSM might
* (depending on its state) enqueue it before transmission */
diff --git a/src/sua.c b/src/sua.c
index c7bde24..e81c471 100644
--- a/src/sua.c
+++ b/src/sua.c
@@ -317,8 +317,10 @@
xua_msg_add_u32(xua, SUA_IEI_ROUTE_CTX, as->cfg.routing_key.context);
msg = sua_to_msg(xua);
- if (!msg)
+ if (!msg) {
+ LOGPAS(as, DLSUA, LOGL_ERROR, "Error encoding SUA Msg\n");
return -1;
+ }
/* send the msg to the AS for transmission. The AS FSM might
* (depending on its state) enqueue it before transmission */
To view, visit change 39395. To unsubscribe, or for help writing mail filters, visit settings.