pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-sigtran/+/40217?usp=email )
Change subject: xua_default_lm_fsm: Avoid accessing asp after restart ...................................................................... xua_default_lm_fsm: Avoid accessing asp after restart Avoid restarting the ASP upon LM_E_SCTP_DISC_IND: * The SCTP event may actually come from an existing call to osmo_ss7_asp_restart() which has called. * For SCTP server asps, there's no need to actually restart the ASP, since we have to wait for client to connect to us again. * For SCTP client asps, the lower layers are already triggering reconnect, no need to do anything other than waiting for SCTP_EST_IND. * ASP may be no longer accessible after dropping conn if it was a dynamic SCTP-server one. Hence, better keep the call setting up the FSM in the ASP in osmo_ss7_asp_restart(), where we know if asp is still alive. Change-Id: I009a34d098abd61fa3c014787d52c09491fcab76 --- M src/osmo_ss7_asp.c M src/xua_default_lm_fsm.c 2 files changed, 26 insertions(+), 28 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran refs/changes/17/40217/1 diff --git a/src/osmo_ss7_asp.c b/src/osmo_ss7_asp.c index 1c303b6..735c5fd 100644 --- a/src/osmo_ss7_asp.c +++ b/src/osmo_ss7_asp.c @@ -756,6 +756,16 @@ osmo_fsm_inst_term(asp->fi, OSMO_FSM_TERM_REQUEST, NULL); OSMO_ASSERT(!asp->fi); } + + /* Apply default LM FSM for client ASP */ + if (asp->cfg.proto != OSMO_SS7_ASP_PROT_IPA && + asp->cfg.role == OSMO_SS7_ASP_ROLE_ASP && + !asp->cfg.is_server) { + osmo_ss7_asp_use_default_lm(asp, LOGL_DEBUG); + } else { + osmo_ss7_asp_remove_default_lm(asp); + } + if ((rc = xua_asp_fsm_start(asp, asp->cfg.role, LOGL_DEBUG)) < 0) return rc; OSMO_ASSERT(asp->fi); @@ -1323,15 +1333,6 @@ * specific default values */ ss7_asp_set_default_peer_hosts(asp); - /* Apply default LM FSM for client ASP */ - if (asp->cfg.proto != OSMO_SS7_ASP_PROT_IPA && - asp->cfg.role == OSMO_SS7_ASP_ROLE_ASP && - !asp->cfg.is_server) { - osmo_ss7_asp_use_default_lm(asp, LOGL_DEBUG); - } else { - osmo_ss7_asp_remove_default_lm(asp); - } - osmo_ss7_asp_restart(asp); } diff --git a/src/xua_default_lm_fsm.c b/src/xua_default_lm_fsm.c index 0952c9e..3aceb26 100644 --- a/src/xua_default_lm_fsm.c +++ b/src/xua_default_lm_fsm.c @@ -160,17 +160,6 @@ return 0; } -static void restart_asp(struct osmo_fsm_inst *fi) -{ - struct lm_fsm_priv *lmp = fi->priv; - struct osmo_ss7_asp *asp = lmp->asp; - int log_level = fi->log_level; - - osmo_ss7_asp_restart(asp); - osmo_ss7_asp_use_default_lm(asp, log_level); -} - - static void lm_idle(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct lm_fsm_priv *lmp = fi->priv; @@ -317,7 +306,7 @@ OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION); if (oxp->u.notify.status_type == M3UA_NOTIFY_T_STATCHG && oxp->u.notify.status_info != M3UA_NOTIFY_I_AS_ACT) - restart_asp(fi); + lm_fsm_state_chg(fi, S_IDLE); break; } } @@ -326,7 +315,7 @@ { switch (event) { case LM_E_SCTP_DISC_IND: - restart_asp(fi); + lm_fsm_state_chg(fi, S_IDLE); break; } } @@ -334,30 +323,38 @@ static const struct osmo_fsm_state lm_states[] = { [S_IDLE] = { .in_event_mask = S(LM_E_SCTP_EST_IND), - .out_state_mask = S(S_WAIT_ASP_UP), + .out_state_mask = S(S_IDLE) | + S(S_WAIT_ASP_UP), .name = "IDLE", .action = lm_idle, }, [S_WAIT_ASP_UP] = { .in_event_mask = S(LM_E_ASP_UP_CONF), - .out_state_mask = S(S_WAIT_NOTIFY), + .out_state_mask = S(S_IDLE) | + S(S_WAIT_NOTIFY), .name = "WAIT_ASP_UP", .action = lm_wait_asp_up, }, [S_WAIT_NOTIFY] = { - .in_event_mask = S(LM_E_AS_INACTIVE_IND) | S(LM_E_NOTIFY_IND), - .out_state_mask = S(S_RKM_REG) | S(S_ACTIVE), + .in_event_mask = S(LM_E_AS_INACTIVE_IND) | + S(LM_E_NOTIFY_IND), + .out_state_mask = S(S_IDLE) | + S(S_RKM_REG) | + S(S_ACTIVE), .name = "WAIT_NOTIFY", .action = lm_wait_notify, }, [S_RKM_REG] = { .in_event_mask = S(LM_E_RKM_REG_CONF), - .out_state_mask = S(S_WAIT_NOTIFY), + .out_state_mask = S(S_IDLE) | + S(S_WAIT_NOTIFY), .name = "RKM_REG", .action = lm_rkm_reg, }, [S_ACTIVE] = { - .in_event_mask = S(LM_E_AS_INACTIVE_IND) | S(LM_E_NOTIFY_IND), + .in_event_mask = S(LM_E_AS_INACTIVE_IND) | + S(LM_E_NOTIFY_IND), + .out_state_mask = S(S_IDLE), .name = "ACTIVE", .action = lm_active, }, -- To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/40217?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: libosmo-sigtran Gerrit-Branch: master Gerrit-Change-Id: I009a34d098abd61fa3c014787d52c09491fcab76 Gerrit-Change-Number: 40217 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pes...@sysmocom.de>