pespin submitted this change.

View Change

Approvals: Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve laforge: Looks good to me, approved
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(-)

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 change 41418. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: If4360f07aa199e84c57820957ddde4259d1c92ce
Gerrit-Change-Number: 41418
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>