pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-sigtran/+/42566?usp=email )


Change subject: xua_lm: Handle M-Error.ind
......................................................................

xua_lm: Handle M-Error.ind

Change-Id: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
---
M src/xua_default_lm_fsm.c
1 file changed, 45 insertions(+), 7 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran 
refs/changes/66/42566/1

diff --git a/src/xua_default_lm_fsm.c b/src/xua_default_lm_fsm.c
index 6f25e17..dbca526 100644
--- a/src/xua_default_lm_fsm.c
+++ b/src/xua_default_lm_fsm.c
@@ -64,6 +64,7 @@
        LM_E_ASP_ACT_IND,
        LM_E_ASP_INACT_IND,
        LM_E_NOTIFY_IND,
+       LM_E_ERROR_IND,
        LM_E_AS_INACTIVE_IND,
        LM_E_AS_ACTIVE_IND,
        LM_E_AS_STATUS_IND,
@@ -78,6 +79,7 @@
        { LM_E_ASP_ACT_IND,     "ASP-ACT.ind" },
        { LM_E_ASP_INACT_IND,   "ASP-INACT.ind" },
        { LM_E_NOTIFY_IND,      "NOTIFY.ind" },
+       { LM_E_ERROR_IND,       "ERROR.ind" },
        { LM_E_AS_INACTIVE_IND, "AS-INACTIVE.ind" },
        { LM_E_AS_ACTIVE_IND,   "AS-ACTIVE.ind" },
        { LM_E_AS_STATUS_IND,   "AS-STATUS.ind" },
@@ -205,6 +207,8 @@

 static void lm_wait_asp_up(struct osmo_fsm_inst *fi, uint32_t event, void 
*data)
 {
+       const struct osmo_xlm_prim *oxp = data;
+
        switch (event) {
        case LM_E_ASP_UP_CONF:
                ENSURE_ASP_OR_IPSP(fi, event);
@@ -219,6 +223,16 @@
                */
                lm_fsm_state_chg(fi, S_WAIT_NOTIFY);
                break;
+       case LM_E_ERROR_IND:
+               ENSURE_ASP_OR_IPSP(fi, event);
+               OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_ERROR);
+               OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION);
+               /* Our ASPUP was most probably rejected by peer with an M3UA 
ERR.
+                * Log the issue and let the SS7_ASP_LM_T_WAIT_ASP_UP timer 
timeout in a while and
+                * then attempt again  */
+               LOGPFSML(fi, LOGL_NOTICE, "Received M-ERROR.ind with error code 
%u (%s)\n",
+                        oxp->u.error.code, get_value_string(m3ua_err_names, 
oxp->u.error.code));
+               break;
        }
 }

@@ -270,12 +284,11 @@
 static void lm_rkm_reg(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
        struct xua_layer_manager_default_priv *lmp = fi->priv;
-       struct osmo_xlm_prim *oxp;
+       struct osmo_xlm_prim *oxp = data;
        int rc;

        switch (event) {
        case LM_E_RKM_REG_CONF:
-               oxp = data;
                if (oxp->u.rk_reg.status != M3UA_RKM_REG_SUCCESS) {
                        LOGPFSML(fi, LOGL_NOTICE, "Received RKM_REG_RSP with 
negative result\n");
                        xlm_sap_down_simple(lmp->asp, 
OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST);
@@ -291,13 +304,24 @@
                        osmo_fsm_inst_state_chg(fi, S_WAIT_NOTIFY, timeout_sec, 
SS7_ASP_LM_T_WAIT_NOTIY_RKM);
                }
                break;
+       case LM_E_ERROR_IND:
+               ENSURE_ASP_OR_IPSP(fi, event);
+               OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_ERROR);
+               OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION);
+               /* Our RKM_REQ REQ was most probably rejected by peer with an 
M3UA ERR.
+                * Go back to Wait Notify to either wait for some notificaiton 
to re-attempt,
+                * or end up timing out and reconnecting. */
+               LOGPFSML(fi, LOGL_NOTICE, "Received M-ERROR.ind with error code 
%u (%s)\n",
+                        oxp->u.error.code, get_value_string(m3ua_err_names, 
oxp->u.error.code));
+               lm_fsm_state_chg(fi, S_WAIT_NOTIFY);
+               break;
        }
 }

 static void lm_active(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
        struct xua_layer_manager_default_priv *lmp = fi->priv;
-       struct osmo_xlm_prim *oxp;
+       struct osmo_xlm_prim *oxp = data;

        switch (event) {
        case LM_E_ASP_ACT_IND:
@@ -309,7 +333,6 @@
                xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_ASP_ACTIVE, 
PRIM_OP_REQUEST);
                break;
        case LM_E_NOTIFY_IND:
-               oxp = data;
                ENSURE_ASP_OR_IPSP(fi, event);
                OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_NOTIFY);
                OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION);
@@ -320,6 +343,17 @@
                        lm_fsm_state_chg(fi, S_WAIT_NOTIFY);
                }
                break;
+       case LM_E_ERROR_IND:
+               ENSURE_ASP_OR_IPSP(fi, event);
+               OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_ERROR);
+               OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION);
+               /* Our ASPAC was most probably rejected by peer with an M3UA 
ERR.
+                * Go back to Wait Notify to either wait for some notificaiton 
to re-attempt,
+                * or end up timing out and reconnecting. */
+               LOGPFSML(fi, LOGL_NOTICE, "Received M-ERROR.ind with error code 
%u (%s)\n",
+                        oxp->u.error.code, get_value_string(m3ua_err_names, 
oxp->u.error.code));
+               lm_fsm_state_chg(fi, S_WAIT_NOTIFY);
+               break;
        }
 }

@@ -380,7 +414,8 @@
        },
        [S_WAIT_ASP_UP] = {
                .in_event_mask = S(LM_E_ASP_UP_CONF) |
-                                S(LM_E_ASP_UP_IND),
+                                S(LM_E_ASP_UP_IND) |
+                                S(LM_E_ERROR_IND),
                .out_state_mask = S(S_IDLE) |
                                  S(S_WAIT_NOTIFY),
                .name = "WAIT_ASP_UP",
@@ -398,7 +433,8 @@
                .action = lm_wait_notify,
        },
        [S_RKM_REG] = {
-               .in_event_mask = S(LM_E_RKM_REG_CONF),
+               .in_event_mask = S(LM_E_RKM_REG_CONF) |
+                                S(LM_E_ERROR_IND),
                .out_state_mask = S(S_IDLE) |
                                  S(S_WAIT_NOTIFY),
                .name = "RKM_REG",
@@ -407,7 +443,8 @@
        [S_ACTIVE] = {
                .in_event_mask = S(LM_E_ASP_ACT_IND) |
                                 S(LM_E_AS_INACTIVE_IND) |
-                                S(LM_E_NOTIFY_IND),
+                                S(LM_E_NOTIFY_IND) |
+                                S(LM_E_ERROR_IND),
                .out_state_mask = S(S_IDLE) |
                                  S(S_WAIT_NOTIFY),
                .name = "ACTIVE",
@@ -425,6 +462,7 @@
        { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_INACTIVE, PRIM_OP_INDICATION, 
LM_E_ASP_INACT_IND },
        { XUA_SAP_LM, OSMO_XLM_PRIM_M_AS_STATUS, PRIM_OP_INDICATION, 
LM_E_AS_STATUS_IND },
        { XUA_SAP_LM, OSMO_XLM_PRIM_M_NOTIFY, PRIM_OP_INDICATION, 
LM_E_NOTIFY_IND },
+       { XUA_SAP_LM, OSMO_XLM_PRIM_M_ERROR, PRIM_OP_INDICATION, LM_E_ERROR_IND 
},
        { XUA_SAP_LM, OSMO_XLM_PRIM_M_AS_INACTIVE, PRIM_OP_INDICATION, 
LM_E_AS_INACTIVE_IND },
        { XUA_SAP_LM, OSMO_XLM_PRIM_M_AS_ACTIVE, PRIM_OP_INDICATION, 
LM_E_AS_ACTIVE_IND },
        { XUA_SAP_LM, OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_CONFIRM, 
LM_E_RKM_REG_CONF },

--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/42566?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: I5bdba1ab09084b3eafcb8b4aaa9c9762b15e8583
Gerrit-Change-Number: 42566
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>

Reply via email to