diff --git a/src/osmo-smlc/sccp_lb_inst.c b/src/osmo-smlc/sccp_lb_inst.c index bfe8a0e..cea74bf 100644 --- a/src/osmo-smlc/sccp_lb_inst.c +++ b/src/osmo-smlc/sccp_lb_inst.c @@ -85,6 +85,36 @@ struct sccp_lb_inst *sccp_lb_init(void *talloc_ctx, struct osmo_sccp_instance *s return sli; } +static void handle_notice_ind(struct sccp_lb_inst *sli, const struct osmo_scu_notice_param *ni) +{ + struct lb_peer *lbp; + + lbp = lb_peer_find(sli, &ni->calling_addr); + if (!lbp) { + LOG_SCCP_LB(sli, LOGL_DEBUG, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s' importance=%u didn't match any lb_peer, ignoring\n", + osmo_sccp_addr_dump(&ni->calling_addr), + ni->cause, osmo_sccp_return_cause_name(ni->cause), + ni->importance); + return; + } + + LOG_LB_PEER(lbp, 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 lb_peer. Signal it is unavailable to update local state. */ + osmo_fsm_inst_dispatch(lbp->fi, LB_PEER_EV_UNAVAILABLE, NULL); +} + static void handle_pcstate_ind(struct sccp_lb_inst *sli, const struct osmo_scu_pcstate_param *pcst) { struct osmo_ss7_instance *cs7 = osmo_sccp_get_ss7(sli->sccp); @@ -253,6 +283,11 @@ static int sccp_lb_sap_up(struct osmo_prim_hdr *oph, void *_scu) rc = lb_peer_up_l2(sli, peer_addr, false, 0, oph->msg); break; + case OSMO_PRIM(OSMO_SCU_PRIM_N_NOTICE, PRIM_OP_INDICATION): + handle_notice_ind(sli, &prim->u.notice); + rc = 0; + break; + case OSMO_PRIM(OSMO_SCU_PRIM_N_PCSTATE, PRIM_OP_INDICATION): handle_pcstate_ind(sli, &prim->u.pcstate); rc = 0;