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

--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/41418?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: If4360f07aa199e84c57820957ddde4259d1c92ce
Gerrit-Change-Number: 41418
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to