pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmo-sigtran/+/41417?usp=email )
Change subject: mtp: Introduce mtp_prim_* API helpers ......................................................................
mtp: Introduce mtp_prim_* API helpers
This allows keeping more API related packing inside mtp_sap.c, as well as provide public API to be able to submit a MTP-TRANSFER.req from outside of the library (which will be used by osmo-bsc to submit MGCP/CTRL over IPA in SCCPLite).
Change-Id: I4af154a65b8c23b9e8647845337ad1b5aa3901aa --- M TODO-RELEASE M include/osmocom/sigtran/mtp_sap.h M src/mtp_sap.c M src/sccp_scrc.c M src/ss7_hmrt.c M src/ss7_user.h 6 files changed, 55 insertions(+), 19 deletions(-)
Approvals: pespin: Looks good to me, approved Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve laforge: Looks good to me, but someone else must approve
diff --git a/TODO-RELEASE b/TODO-RELEASE index dd3b333..28aed5b 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -11,3 +11,4 @@ libosmo-sigtran add enum mtp_network_indicator, mtp_network_indicator_vals libosmo-sigtran add osmo_ss7_instance_get_network_indicator() libosmo-sigtran add osmo_ss7_user_mtp_sap_prim_down() +libosmo-sigtran add osmo_mtp_prim_xfer_req_prepend() diff --git a/include/osmocom/sigtran/mtp_sap.h b/include/osmocom/sigtran/mtp_sap.h index 590e0ab..4cc280d 100644 --- a/include/osmocom/sigtran/mtp_sap.h +++ b/include/osmocom/sigtran/mtp_sap.h @@ -72,3 +72,6 @@ #define msgb_mtp_prim(msg) ((struct osmo_mtp_prim *)(msg)->l1h)
char *osmo_mtp_prim_name(const struct osmo_prim_hdr *oph); + +struct osmo_mtp_prim *osmo_mtp_prim_xfer_req_prepend(const struct osmo_mtp_transfer_param *param, + struct msgb *msg); diff --git a/src/mtp_sap.c b/src/mtp_sap.c index cef0497..d3656bc 100644 --- a/src/mtp_sap.c +++ b/src/mtp_sap.c @@ -62,6 +62,47 @@ return prim_name_buf; }
+struct osmo_mtp_prim *mtp_prim_xfer_ind_alloc(const struct osmo_mtp_transfer_param *param, + const uint8_t *user_data, size_t user_data_len) +{ + struct osmo_mtp_prim *prim; + struct msgb *upmsg = m3ua_msgb_alloc("M3UA MTP-TRANSFER.ind"); + + OSMO_ASSERT(upmsg); + prim = (struct osmo_mtp_prim *) msgb_put(upmsg, sizeof(*prim)); + + /* Allow filling in params later: */ + if (param) + prim->u.transfer = *param; + + osmo_prim_init(&prim->oph, MTP_SAP_USER, + OSMO_MTP_PRIM_TRANSFER, + PRIM_OP_INDICATION, upmsg); + /* copy data */ + upmsg->l2h = msgb_put(upmsg, user_data_len); + memcpy(upmsg->l2h, user_data, user_data_len); + + return prim; +} + +/*! \brief Wrap MTP payload into an MTP-TRANSFER.req primitive + * \param[in] param MTP-TRANSFER.req params to copy to the primitive (Optional, can be NULL) + * \param[in] msg msgb containing MTP payload and where primitive will be prepended + * \returns return MTP-TRANSFER.req prepended to msgb + */ +struct osmo_mtp_prim *osmo_mtp_prim_xfer_req_prepend(const struct osmo_mtp_transfer_param *param, struct msgb *msg) +{ + struct osmo_mtp_prim *omp; + + msg->l2h = msg->data; + omp = (struct osmo_mtp_prim *) msgb_push(msg, sizeof(*omp)); + osmo_prim_init(&omp->oph, MTP_SAP_USER, + OSMO_MTP_PRIM_TRANSFER, PRIM_OP_REQUEST, msg); + if (param) + omp->u.transfer = *param; + return omp; +} + /*! \brief Send a MTP SAP Primitive up to the MTP User * \param[in] osu MTP User to whom to send the primitive * \param[in] prim Primitive to send to the user diff --git a/src/sccp_scrc.c b/src/sccp_scrc.c index 9cf71a3..92f7818 100644 --- a/src/sccp_scrc.c +++ b/src/sccp_scrc.c @@ -114,10 +114,7 @@ }
/* 2) wrap into MTP-TRANSFER.req primitive */ - msg->l2h = msg->data; - omp = (struct osmo_mtp_prim *) msgb_push(msg, sizeof(*omp)); - osmo_prim_init(&omp->oph, MTP_SAP_USER, - OSMO_MTP_PRIM_TRANSFER, PRIM_OP_REQUEST, msg); + omp = osmo_mtp_prim_xfer_req_prepend(NULL, msg); param = &omp->u.transfer; if (sua->mtp.opc) param->opc = sua->mtp.opc; diff --git a/src/ss7_hmrt.c b/src/ss7_hmrt.c index b915481..81a56a8 100644 --- a/src/ss7_hmrt.c +++ b/src/ss7_hmrt.c @@ -46,30 +46,20 @@ /* convert from M3UA message to MTP-TRANSFER.ind osmo_mtp_prim */ static struct osmo_mtp_prim *m3ua_to_xfer_ind(struct xua_msg *xua) { - struct osmo_mtp_prim *prim; - struct osmo_mtp_transfer_param *param; struct xua_msg_part *data_ie = xua_msg_find_tag(xua, M3UA_IEI_PROT_DATA); + struct osmo_mtp_prim *prim; struct m3ua_data_hdr *data_hdr; - struct msgb *upmsg = m3ua_msgb_alloc("M3UA MTP-TRANSFER.ind");
if (!data_ie || data_ie->len < sizeof(*data_hdr)) { /* FIXME: ERROR message */ - msgb_free(upmsg); return NULL; } data_hdr = (struct m3ua_data_hdr *) data_ie->dat;
- /* fill primitive */ - prim = (struct osmo_mtp_prim *) msgb_put(upmsg, sizeof(*prim)); - param = &prim->u.transfer; - osmo_prim_init(&prim->oph, MTP_SAP_USER, - OSMO_MTP_PRIM_TRANSFER, - PRIM_OP_INDICATION, upmsg); - - m3ua_dh_to_xfer_param(param, data_hdr); - /* copy data */ - upmsg->l2h = msgb_put(upmsg, data_ie->len - sizeof(*data_hdr)); - memcpy(upmsg->l2h, data_ie->dat+sizeof(*data_hdr), data_ie->len - sizeof(*data_hdr)); + prim = mtp_prim_xfer_ind_alloc(NULL, + data_ie->dat + sizeof(*data_hdr), + data_ie->len - sizeof(*data_hdr)); + m3ua_dh_to_xfer_param(&prim->u.transfer, data_hdr);
return prim; } diff --git a/src/ss7_user.h b/src/ss7_user.h index 280fc82..a1cd21b 100644 --- a/src/ss7_user.h +++ b/src/ss7_user.h @@ -1,6 +1,7 @@ #pragma once
#include <stdint.h> +#include <unistd.h> #include <osmocom/core/prim.h> #include <osmocom/sigtran/mtp_sap.h>
@@ -25,6 +26,9 @@ void ss7_user_unregister_all(struct osmo_ss7_user *user); int ss7_user_mtp_sap_prim_up(const struct osmo_ss7_user *osu, struct osmo_mtp_prim *omp);
+struct osmo_mtp_prim *mtp_prim_xfer_ind_alloc(const struct osmo_mtp_transfer_param *param, + const uint8_t *user_data, size_t user_data_len); + #define _LOGPSS7U(osu, subsys, level, fmt, args ...) \ _LOGSS7((osu)->inst, subsys, level, "ss7_user(%s) " fmt, osu->name, ## args) #define LOGPSS7U(osu, level, fmt, args ...) \