pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmo-sigtran/+/41418?usp=email )
Change subject: mtp: Submit MTP-RESUME/PAUSE.ind up over MTP SAP ......................................................................
mtp: Submit MTP-RESUME/PAUSE.ind up over MTP SAP
This allows supporting MTP users other than existing internal SCCP stack.
Change-Id: If4360f07aa199e84c57820957ddde4259d1c92ce --- M src/mtp_sap.c M src/sccp_instance.c M src/ss7_user.h M src/xua_snm.c 4 files changed, 76 insertions(+), 11 deletions(-)
Approvals: Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve laforge: Looks good to me, approved
diff --git a/src/mtp_sap.c b/src/mtp_sap.c index d3656bc..844b544 100644 --- a/src/mtp_sap.c +++ b/src/mtp_sap.c @@ -62,6 +62,39 @@ return prim_name_buf; }
+static struct msgb *mtp_prim_msgb_alloc(void) +{ + return m3ua_msgb_alloc("mtp_prim_up"); +} + +static struct osmo_mtp_prim *mtp_prim_resume_ind_alloc(uint32_t pc) +{ + struct msgb *upmsg = mtp_prim_msgb_alloc(); + struct osmo_mtp_prim *prim; + + OSMO_ASSERT(upmsg); + prim = (struct osmo_mtp_prim *) msgb_put(upmsg, sizeof(*prim)); + osmo_prim_init(&prim->oph, MTP_SAP_USER, + OSMO_MTP_PRIM_RESUME, + PRIM_OP_INDICATION, upmsg); + prim->u.resume.affected_dpc = pc; + return prim; +} + +static struct osmo_mtp_prim *mtp_prim_pause_ind_alloc(uint32_t pc) +{ + struct msgb *upmsg = mtp_prim_msgb_alloc(); + struct osmo_mtp_prim *prim; + + OSMO_ASSERT(upmsg); + prim = (struct osmo_mtp_prim *) msgb_put(upmsg, sizeof(*prim)); + osmo_prim_init(&prim->oph, MTP_SAP_USER, + OSMO_MTP_PRIM_PAUSE, + PRIM_OP_INDICATION, upmsg); + prim->u.pause.affected_dpc = pc; + return prim; +} + 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) { @@ -103,6 +136,28 @@ return omp; }
+void mtp_resume_ind_up_to_all_users(struct osmo_ss7_instance *s7i, uint32_t pc) +{ + for (unsigned int service_ind = 0; service_ind < ARRAY_SIZE(s7i->user); service_ind++) { + struct osmo_mtp_prim *omp; + if (!s7i->user[service_ind]) + continue; + omp = mtp_prim_resume_ind_alloc(pc); + ss7_user_mtp_sap_prim_up(s7i->user[service_ind], omp); + } +} + +void mtp_pause_ind_up_to_all_users(struct osmo_ss7_instance *s7i, uint32_t pc) +{ + for (unsigned int service_ind = 0; service_ind < ARRAY_SIZE(s7i->user); service_ind++) { + struct osmo_mtp_prim *omp; + if (!s7i->user[service_ind]) + continue; + omp = mtp_prim_pause_ind_alloc(pc); + ss7_user_mtp_sap_prim_up(s7i->user[service_ind], 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_instance.c b/src/sccp_instance.c index 0d67e4d..a093308 100644 --- a/src/sccp_instance.c +++ b/src/sccp_instance.c @@ -260,7 +260,7 @@ struct osmo_sccp_instance *inst = ctx; struct osmo_mtp_prim *omp = (struct osmo_mtp_prim *)oph; struct xua_msg *xua; - int rc; + int rc = 0;
OSMO_ASSERT(oph->sap == MTP_SAP_USER);
@@ -279,6 +279,12 @@ rc = scrc_rx_mtp_xfer_ind_xua(inst, xua); xua_msg_free(xua); break; + case OSMO_PRIM(OSMO_MTP_PRIM_RESUME, PRIM_OP_INDICATION): + sccp_scmg_rx_mtp_resume(inst, omp->u.resume.affected_dpc); + break; + case OSMO_PRIM(OSMO_MTP_PRIM_PAUSE, PRIM_OP_INDICATION): + sccp_scmg_rx_mtp_pause(inst, omp->u.pause.affected_dpc); + break; default: LOGPSCI(inst, LOGL_ERROR, "Unknown primitive %u:%u receivd\n", oph->primitive, oph->operation); diff --git a/src/ss7_user.h b/src/ss7_user.h index a1cd21b..0da1eea 100644 --- a/src/ss7_user.h +++ b/src/ss7_user.h @@ -29,6 +29,10 @@ 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);
+void mtp_resume_ind_up_to_all_users(struct osmo_ss7_instance *s7i, uint32_t pc); +void mtp_pause_ind_up_to_all_users(struct osmo_ss7_instance *s7i, uint32_t pc); + + #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 ...) \ diff --git a/src/xua_snm.c b/src/xua_snm.c index fd2ef24..adaa7ff 100644 --- a/src/xua_snm.c +++ b/src/xua_snm.c @@ -36,6 +36,7 @@ #include "ss7_route.h" #include "ss7_internal.h" #include "ss7_route_table.h" +#include "ss7_user.h" #include "xua_internal.h" #include "sccp_internal.h"
@@ -132,10 +133,10 @@ } }
-/* generate MTP-PAUSE / MTP-RESUME towards local SCCP users */ -static void xua_snm_pc_available_to_sccp(struct osmo_sccp_instance *sccp, - const uint32_t *aff_pc, unsigned int num_aff_pc, - bool available) +/* generate MTP-PAUSE / MTP-RESUME towards local MTP users */ +static void xua_snm_pc_available_to_mtp_users(struct osmo_ss7_instance *s7i, + const uint32_t *aff_pc, unsigned int num_aff_pc, + bool available) { int i; for (i = 0; i < num_aff_pc; i++) { @@ -147,9 +148,9 @@
if (!mask) { if (available) - sccp_scmg_rx_mtp_resume(sccp, pc); + mtp_resume_ind_up_to_all_users(s7i, pc); else - sccp_scmg_rx_mtp_pause(sccp, pc); + mtp_pause_ind_up_to_all_users(s7i, pc); } else { /* we have to send one MTP primitive for each individual point * code within that mask */ @@ -157,9 +158,9 @@ uint32_t fullpc; for (fullpc = (pc & ~maskbits); fullpc <= (pc | maskbits); fullpc++) { if (available) - sccp_scmg_rx_mtp_resume(sccp, fullpc); + mtp_resume_ind_up_to_all_users(s7i, fullpc); else - sccp_scmg_rx_mtp_pause(sccp, fullpc); + mtp_pause_ind_up_to_all_users(s7i, fullpc); } } } @@ -231,8 +232,7 @@
/* inform local users via a MTP-{PAUSE, RESUME} primitive */ - if (s7i->sccp) - xua_snm_pc_available_to_sccp(s7i->sccp, aff_pc, num_aff_pc, available); + xua_snm_pc_available_to_mtp_users(s7i, aff_pc, num_aff_pc, available);
/* inform remote ASPs via DUNA/DAVA */ llist_for_each_entry(asp, &s7i->asp_list, list) {