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@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);