pespin has uploaded this change for review. ( 
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(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran 
refs/changes/17/41417/1

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 1118e81..34ff2b1 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 https://gerrit.osmocom.org/c/libosmo-sigtran/+/41417?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I4af154a65b8c23b9e8647845337ad1b5aa3901aa
Gerrit-Change-Number: 41417
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>

Reply via email to