pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bsc/+/40706?usp=email )
Change subject: sccp: Handle N-NOTICE.ind (Routing Failure of SCCP CL messages)
......................................................................
sccp: Handle N-NOTICE.ind (Routing Failure of SCCP CL messages)
ITU Q.714 2.8:
"""
When an end node is informed of a routing failure, this information
is forwarded towards the SCCP user by using the N-DISCONNECT primitive
(refer to reason for release in 2.1.1.2.4/Q.711) or the N-NOTICE primitive
(refer to reason for return in 2.2.2.2.4/Q.711)
"""
We are already handling N-DISCONNECT.ind for CO messages, but
N-NOTICE.ind for CL messages was not being handled.
If CL messages are not arriving to the peer (MSC), then reset the link
and mark the peer as disconnected, until a new RESET can successfully fo
through.
Related: OS#5917
Change-Id: I3f6c120183a53a80255de71366935b6c07fcfbc8
---
M src/osmo-bsc/osmo_bsc_sigtran.c
1 file changed, 38 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/06/40706/1
diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c
index 0b48a02..3f97d36 100644
--- a/src/osmo-bsc/osmo_bsc_sigtran.c
+++ b/src/osmo-bsc/osmo_bsc_sigtran.c
@@ -1,4 +1,4 @@
-/* (C) 2017 by sysmocom s.f.m.c. GmbH, Author: Philipp Maier
+/* (C) 2017-2025 by sysmocom s.f.m.c. GmbH, Author: Philipp Maier
* (C) 2017-2018 by Harald Welte <laforge(a)gnumonks.org>
* All Rights Reserved
*
@@ -22,6 +22,7 @@
#include <osmocom/core/fsm.h>
#include <osmocom/sigtran/osmo_ss7.h>
#include <osmocom/sigtran/sccp_sap.h>
+#include <osmocom/sccp/sccp_types.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/gsm/gsm0808.h>
#include <osmocom/gsm/protocol/ipaccess.h>
@@ -157,6 +158,37 @@
return rc;
}
+static int handle_notice_ind(struct osmo_ss7_instance *cs7, const struct
osmo_scu_notice_param *ni)
+{
+ int rc = 0;
+ struct bsc_msc_data *msc = get_msc_by_addr(&ni->calling_addr);
+ if (!msc) {
+ LOGP(DMSC, LOGL_DEBUG, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s'
importance=%u didn't match any MSC, ignoring\n",
+ osmo_sccp_addr_dump(&ni->calling_addr),
+ ni->cause, osmo_sccp_return_cause_name(ni->cause),
+ ni->importance);
+ return rc;
+ }
+
+ LOG_MSC(msc, LOGL_NOTICE, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s'
importance=%u\n",
+ osmo_sccp_addr_dump(&ni->calling_addr),
+ ni->cause, osmo_sccp_return_cause_name(ni->cause),
+ ni->importance);
+
+ switch (ni->cause) {
+ case SCCP_RETURN_CAUSE_SUBSYSTEM_CONGESTION:
+ case SCCP_RETURN_CAUSE_NETWORK_CONGESTION:
+ /* Transient failures (hopefully), keep going. */
+ return rc;
+ default:
+ /* continue below: */
+ }
+
+ /* Messages are not arriving to MSC. Kick the BSSMAP back to DISC state. */
+ bssmap_reset_set_disconnected(msc->a.bssmap_reset);
+ return rc;
+}
+
static int handle_n_connect_from_msc(struct osmo_sccp_user *scu, struct osmo_scu_prim
*scu_prim)
{
struct bsc_msc_data *msc = get_msc_by_addr(&scu_prim->u.connect.calling_addr);
@@ -317,6 +349,11 @@
rc = handle_unitdata_from_msc(&scu_prim->u.unitdata.calling_addr, oph->msg,
scu);
break;
+ case OSMO_PRIM(OSMO_SCU_PRIM_N_NOTICE, PRIM_OP_INDICATION):
+ DEBUGP(DMSC, "N-NOTICE.ind(%s)\n", osmo_hexdump(msgb_l2(oph->msg),
msgb_l2len(oph->msg)));
+ rc = handle_notice_ind(osmo_sccp_get_ss7(sccp), &scu_prim->u.notice);
+ break;
+
case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_INDICATION):
/* Handle inbound connections */
DEBUGP(DMSC, "N-CONNECT.ind(X->%u)\n", scu_prim->u.connect.conn_id);
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bsc/+/40706?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I3f6c120183a53a80255de71366935b6c07fcfbc8
Gerrit-Change-Number: 40706
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>