pespin submitted this change.

View Change

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
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(-)

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 ...) \

To view, visit change 41417. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I4af154a65b8c23b9e8647845337ad1b5aa3901aa
Gerrit-Change-Number: 41417
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge@osmocom.org>
Gerrit-Reviewer: osmith <osmith@sysmocom.de>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>