pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-msc/+/40710?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 RAN peer, then reset the link and mark the peer as disconnected, until a new RESET can successfully fo through.
Change-Id: Iddd10c8f97310b600374ff0141ea06e03087da8f Related: OS#5917 --- M src/libmsc/sccp_ran.c 1 file changed, 35 insertions(+), 0 deletions(-)
Approvals: Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve daniel: Looks good to me, but someone else must approve pespin: Looks good to me, approved
diff --git a/src/libmsc/sccp_ran.c b/src/libmsc/sccp_ran.c index 71d250e..bc3d659 100644 --- a/src/libmsc/sccp_ran.c +++ b/src/libmsc/sccp_ran.c @@ -60,6 +60,36 @@ return sri; }
+static void handle_notice_ind(struct sccp_ran_inst *sri, const struct osmo_scu_notice_param *ni) +{ + struct ran_peer *rp; + + rp = ran_peer_find_by_addr(sri, &ni->calling_addr); + if (!rp) { + LOGP(DMSC, LOGL_DEBUG, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s' importance=%u didn't match any ran_peer, ignoring\n", + osmo_sccp_addr_dump(&ni->calling_addr), + ni->cause, osmo_sccp_return_cause_name(ni->cause), + ni->importance); + return; + } + + LOG_RAN_PEER(rp, LOGL_NOTICE, "N-NOTICE.ind cause=%u='%s' importance=%u\n", + 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; + default: + break; + } + + /* Messages are not arriving to ran_peer. Signal it is unavailable to update local state. */ + osmo_fsm_inst_dispatch(rp->fi, RAN_PEER_EV_UNAVAILABLE, NULL); +} + static void handle_pcstate_ind(struct sccp_ran_inst *sri, const struct osmo_scu_pcstate_param *pcst) { struct osmo_ss7_instance *cs7 = osmo_sccp_get_ss7(sri->sccp); @@ -232,6 +262,11 @@ rc = sri->ran->sccp_ran_ops.up_l2(sri, peer_addr, false, 0, oph->msg); break;
+ case OSMO_PRIM(OSMO_SCU_PRIM_N_NOTICE, PRIM_OP_INDICATION): + handle_notice_ind(sri, &prim->u.notice); + rc = 0; + break; + case OSMO_PRIM(OSMO_SCU_PRIM_N_PCSTATE, PRIM_OP_INDICATION): handle_pcstate_ind(sri, &prim->u.pcstate); rc = 0;