<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/22778">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sccp: Notify users of point code available/unavailable<br><br>* add N-PCSTATE.ind and N-STATE.ind definitions to SCCP user SAP<br>* add minimal SCMG (SCCP Management) and LBCS (Local Broadcast)<br>* generate MTP-PAUSE.ind/MTP-RESUME.ind based on received xUA DUNA/DAVA<br>* generate N-PCSTATE.ind towards the local SCCP users<br><br>Change-Id: Idb799f7d7ab329ad12f07b7cbe6336da0891ae92<br>Related: OS#2623, OS#3403, OS#4701<br>---<br>M include/osmocom/sigtran/sccp_sap.h<br>M src/Makefile.am<br>M src/sccp_internal.h<br>A src/sccp_lbcs.c<br>A src/sccp_scmg.c<br>M src/xua_snm.c<br>6 files changed, 233 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sigtran/sccp_sap.h b/include/osmocom/sigtran/sccp_sap.h</span><br><span>index de9b24c..d741644 100644</span><br><span>--- a/include/osmocom/sigtran/sccp_sap.h</span><br><span>+++ b/include/osmocom/sigtran/sccp_sap.h</span><br><span>@@ -137,6 +137,21 @@</span><br><span>  OSMO_SCCP_SSN_BSSAP             = 254,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Q.711 6.3.2.2.5 Signalling point status */</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_sccp_sp_status {</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_SCCP_SP_S_INACCESSIBLE     = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_SP_S_CONGESTED        = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_SP_S_ACCESSIBLE       = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+/* Q.711 6.3.2.2.6 Remote SCCP status */</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_sccp_rem_sccp_status {</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_REM_SCCP_S_AVAILABLE                  = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_REM_SCCP_S_UNAVAILABLE_UNKNOWN        = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_REM_SCCP_S_UNEQUIPPED                 = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_REM_SCCP_S_INACCESSIBLE               = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_REM_SCCP_S_CONGESTED                  = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* legacy shim for name change */</span><br><span> #define OSMO_SCCP_SSN_SMLC_BSSAP OSMO_SCCP_SSN_SMLC_BSSAP_LE</span><br><span> </span><br><span>@@ -226,6 +241,22 @@</span><br><span>   /* user data */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* OSMO_SCU_PRIM_N_STATE */</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_scu_state_param {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t affected_pc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t affected_ssn;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool user_in_service; /* true: UIS; false: UOS */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t ssn_multiplicity_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* OSMO_ASCU_PRIM_N_PCSTATE */</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_scu_pcstate_param {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t affected_pc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t restricted_importance_level;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum osmo_sccp_sp_status sp_status;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum osmo_sccp_rem_sccp_status remote_sccp_status;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct osmo_scu_prim {</span><br><span>   struct osmo_prim_hdr oph;</span><br><span>    union {</span><br><span>@@ -235,6 +266,8 @@</span><br><span>                struct osmo_scu_reset_param reset;</span><br><span>           struct osmo_scu_unitdata_param unitdata;</span><br><span>             struct osmo_scu_notice_param notice;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct osmo_scu_state_param state;</span><br><span style="color: hsl(120, 100%, 40%);">+            struct osmo_scu_pcstate_param pcstate;</span><br><span>       } u;</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 41d2a8d..4558810 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -29,7 +29,8 @@</span><br><span> </span><br><span> libosmo_sigtran_la_SOURCES = sccp_sap.c sua.c m3ua.c xua_msg.c sccp_helpers.c \</span><br><span>                        sccp2sua.c sccp_scrc.c sccp_sclc.c sccp_scoc.c \</span><br><span style="color: hsl(0, 100%, 40%);">-                        sccp_user.c sccp_types.c xua_rkm.c xua_shared.c xua_default_lm_fsm.c \</span><br><span style="color: hsl(120, 100%, 40%);">+                        sccp_user.c sccp_types.c sccp_lbcs.c sccp_scmg.c \</span><br><span style="color: hsl(120, 100%, 40%);">+                            xua_rkm.c xua_shared.c xua_default_lm_fsm.c \</span><br><span>                        osmo_ss7.c osmo_ss7_hmrt.c xua_asp_fsm.c xua_as_fsm.c \</span><br><span>                              xua_snm.c osmo_ss7_vty.c sccp_vty.c ipa.c</span><br><span> libosmo_sigtran_la_LDFLAGS = -version-info $(LIBVERSION) -no-undefined -export-symbols-regex '^osmo_'</span><br><span>diff --git a/src/sccp_internal.h b/src/sccp_internal.h</span><br><span>index 98f6d37..6ad7ee3 100644</span><br><span>--- a/src/sccp_internal.h</span><br><span>+++ b/src/sccp_internal.h</span><br><span>@@ -129,3 +129,13 @@</span><br><span>                                                    bool default_if_unset);</span><br><span> </span><br><span> void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_sccp_instance *inst);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Local Broadcast (LBCS) */</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_lbcs_local_bcast_pcstate(struct osmo_sccp_instance *inst,</span><br><span style="color: hsl(120, 100%, 40%);">+                               const struct osmo_scu_pcstate_param *pcstate);</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_lbcs_local_bcast_state(struct osmo_sccp_instance *inst,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const struct osmo_scu_state_param *state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* SCCP Management (SCMG) */</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_scmg_rx_mtp_pause(struct osmo_sccp_instance *inst, uint32_t dpc);</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_scmg_rx_mtp_resume(struct osmo_sccp_instance *inst, uint32_t dpc);</span><br><span>diff --git a/src/sccp_lbcs.c b/src/sccp_lbcs.c</span><br><span>new file mode 100644</span><br><span>index 0000000..3aa4f7a</span><br><span>--- /dev/null</span><br><span>+++ b/src/sccp_lbcs.c</span><br><span>@@ -0,0 +1,68 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* SCCP Local Broadcast (LBCS) according to ITU-T Q.713/Q.714 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/protocol/sua.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sccp/sccp_types.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "sccp_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform a "local broadcast" of a N-PCSTATE.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_lbcs_local_bcast_pcstate(struct osmo_sccp_instance *inst,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  const struct osmo_scu_pcstate_param *pcstate)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_sccp_user *scu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(scu, &inst->users, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct msgb *upmsg = sccp_msgb_alloc(__func__);</span><br><span style="color: hsl(120, 100%, 40%);">+               struct osmo_scu_prim *prim = (struct osmo_scu_prim *) msgb_put(upmsg, sizeof(*prim));</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_prim_init(&prim->oph, SCCP_SAP_USER, OSMO_SCU_PRIM_N_PCSTATE,</span><br><span style="color: hsl(120, 100%, 40%);">+                             PRIM_OP_INDICATION, upmsg);</span><br><span style="color: hsl(120, 100%, 40%);">+           prim->u.pcstate = *pcstate;</span><br><span style="color: hsl(120, 100%, 40%);">+                sccp_user_prim_up(scu, prim);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform a "local broadcast" of a N-STATE.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_lbcs_local_bcast_state(struct osmo_sccp_instance *inst,</span><br><span style="color: hsl(120, 100%, 40%);">+                                const struct osmo_scu_state_param *state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_sccp_user *scu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(scu, &inst->users, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct msgb *upmsg = sccp_msgb_alloc(__func__);</span><br><span style="color: hsl(120, 100%, 40%);">+               struct osmo_scu_prim *prim = (struct osmo_scu_prim *) msgb_put(upmsg, sizeof(*prim));</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_prim_init(&prim->oph, SCCP_SAP_USER, OSMO_SCU_PRIM_N_STATE,</span><br><span style="color: hsl(120, 100%, 40%);">+                               PRIM_OP_INDICATION, upmsg);</span><br><span style="color: hsl(120, 100%, 40%);">+           prim->u.state = *state;</span><br><span style="color: hsl(120, 100%, 40%);">+            sccp_user_prim_up(scu, prim);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/sccp_scmg.c b/src/sccp_scmg.c</span><br><span>new file mode 100644</span><br><span>index 0000000..4a8ccf6</span><br><span>--- /dev/null</span><br><span>+++ b/src/sccp_scmg.c</span><br><span>@@ -0,0 +1,83 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* SCCP Management (SCMG) according to ITU-T Q.713/Q.714 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/protocol/sua.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sccp/sccp_types.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "sccp_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! brief MTP -> SNM (MTP-PAUSE.ind) - inability to providing MTP service Q.714 5.2.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_scmg_rx_mtp_pause(struct osmo_sccp_instance *inst, uint32_t dpc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_scu_pcstate_param pcstate;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* 1) Informs the translation function to update the translation tables. */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 2) SCCP management marks as "prohibited" the status of the remote signalling point, the</span><br><span style="color: hsl(120, 100%, 40%);">+     remote SCCP and each subsystem at the remote signalling point. */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 3) Discontinues all subsystem status tests (including SSN = 1) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* 4) local broadcast of "user-out-of-service" for each SSN at that dest</span><br><span style="color: hsl(120, 100%, 40%);">+     * [this would require us to track SSNs at each PC, which we don't] */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 5) local broadcast of "signaling point inaccessible" */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 6) local broadcast of "remote SCCP unavailable" */</span><br><span style="color: hsl(120, 100%, 40%);">+       pcstate = (struct osmo_scu_pcstate_param) {</span><br><span style="color: hsl(120, 100%, 40%);">+           .affected_pc = dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+           .restricted_importance_level = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .sp_status = OSMO_SCCP_SP_S_INACCESSIBLE,</span><br><span style="color: hsl(120, 100%, 40%);">+             .remote_sccp_status = OSMO_SCCP_REM_SCCP_S_UNAVAILABLE_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp_lbcs_local_bcast_pcstate(inst, &pcstate);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! brief MTP -> SNM (MTP-RESUME.ind) - ability of providing the MTP service Q.714 5.2.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+void sccp_scmg_rx_mtp_resume(struct osmo_sccp_instance *inst, uint32_t dpc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_scu_pcstate_param pcstate;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* 1) Sets the congestion state of that signalling point */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 2) Instructs the translation function to update the translation tables. */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 3) Marks as "allowed" the status of that destination, and the SCCP */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 4) - not applicable */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* 5) Marks as "allowed" the status of remote subsystems */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* 6) local broadcast of "signalling point accessible" */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 7) local broadcast of "remote SCCP accessible" */</span><br><span style="color: hsl(120, 100%, 40%);">+        pcstate = (struct osmo_scu_pcstate_param) {</span><br><span style="color: hsl(120, 100%, 40%);">+           .affected_pc = dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+           .restricted_importance_level = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .sp_status = OSMO_SCCP_SP_S_ACCESSIBLE,</span><br><span style="color: hsl(120, 100%, 40%);">+               .remote_sccp_status = OSMO_SCCP_REM_SCCP_S_AVAILABLE,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp_lbcs_local_bcast_pcstate(inst, &pcstate);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 8) local broadcast of "user-in-service"</span><br><span style="color: hsl(120, 100%, 40%);">+   * [this would require us to track SSNs at each PC, which we don't] */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/xua_snm.c b/src/xua_snm.c</span><br><span>index c4dffbb..e3efc8e 100644</span><br><span>--- a/src/xua_snm.c</span><br><span>+++ b/src/xua_snm.c</span><br><span>@@ -31,6 +31,7 @@</span><br><span> #include <osmocom/sigtran/protocol/sua.h></span><br><span> </span><br><span> #include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "sccp_internal.h"</span><br><span> </span><br><span> /* we can share this code between M3UA and SUA as the below conditions are true */</span><br><span> osmo_static_assert(M3UA_SNM_DUNA == SUA_SNM_DUNA, _sa_duna);</span><br><span>@@ -98,6 +99,37 @@</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* generate MTP-PAUSE / MTP-RESUME towards local SCCP users */</span><br><span style="color: hsl(120, 100%, 40%);">+static void xua_snm_pc_available_to_sccp(struct osmo_sccp_instance *sccp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  const uint32_t *aff_pc, unsigned int num_aff_pc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      bool available)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < num_aff_pc; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         uint32_t _aff_pc = ntohl(aff_pc[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+          uint32_t pc = _aff_pc & 0xffffff;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t mask = _aff_pc >> 24;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!mask) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (available)</span><br><span style="color: hsl(120, 100%, 40%);">+                                sccp_scmg_rx_mtp_resume(sccp, pc);</span><br><span style="color: hsl(120, 100%, 40%);">+                    else</span><br><span style="color: hsl(120, 100%, 40%);">+                          sccp_scmg_rx_mtp_pause(sccp, pc);</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* we have to send one MTP primitive for each individual point</span><br><span style="color: hsl(120, 100%, 40%);">+                         * code within that mask */</span><br><span style="color: hsl(120, 100%, 40%);">+                   uint32_t maskbits = (1 << mask) - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    uint32_t fullpc;</span><br><span style="color: hsl(120, 100%, 40%);">+                      for (fullpc = (pc & ~maskbits); fullpc <= (pc | maskbits); fullpc++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (available)</span><br><span style="color: hsl(120, 100%, 40%);">+                                        sccp_scmg_rx_mtp_resume(sccp, pc);</span><br><span style="color: hsl(120, 100%, 40%);">+                            else</span><br><span style="color: hsl(120, 100%, 40%);">+                                  sccp_scmg_rx_mtp_pause(sccp, pc);</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* advertise availability of point codes (with masks) */</span><br><span> void xua_snm_pc_available(struct osmo_ss7_as *as, const uint32_t *aff_pc,</span><br><span>                        unsigned int num_aff_pc, const char *info_str, bool available)</span><br><span>@@ -107,6 +139,11 @@</span><br><span>      uint32_t rctx[32];</span><br><span>   unsigned int num_rctx;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* inform local users via a MTP-{PAUSE, RESUME} primitive */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (s7i->sccp)</span><br><span style="color: hsl(120, 100%, 40%);">+             xua_snm_pc_available_to_sccp(s7i->sccp, aff_pc, num_aff_pc, available);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* inform remote ASPs via DUNA/DAVA */</span><br><span>       llist_for_each_entry(asp, &s7i->asp_list, list) {</span><br><span>             /* SSNM is only permitted for ASPs in ACTIVE state */</span><br><span>                if (!osmo_ss7_asp_active(asp))</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/22778">change 22778</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmo-sccp/+/22778"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Idb799f7d7ab329ad12f07b7cbe6336da0891ae92 </div>
<div style="display:none"> Gerrit-Change-Number: 22778 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>