pespin has uploaded this change for review.

View Change

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 change 40217. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I009a34d098abd61fa3c014787d52c09491fcab76
Gerrit-Change-Number: 40217
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>