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>

Reply via email to