pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/libosmo-sigtran/+/42074?usp=email )
Change subject: xua_default_fsm: Support IPSP role
......................................................................
xua_default_fsm: Support IPSP role
Change-Id: Id9ad8bbfce5cf15fedcba83034ae383e61d3b3a3
---
M src/xua_default_lm_fsm.c
1 file changed, 68 insertions(+), 5 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran
refs/changes/74/42074/1
diff --git a/src/xua_default_lm_fsm.c b/src/xua_default_lm_fsm.c
index 3e364c1..d19c0c3 100644
--- a/src/xua_default_lm_fsm.c
+++ b/src/xua_default_lm_fsm.c
@@ -59,6 +59,9 @@
enum lm_event {
LM_E_SCTP_EST_IND,
LM_E_ASP_UP_CONF,
+ LM_E_ASP_UP_IND,
+ LM_E_ASP_ACT_IND,
+ LM_E_ASP_INACT_IND,
LM_E_NOTIFY_IND,
LM_E_AS_INACTIVE_IND,
LM_E_AS_ACTIVE_IND,
@@ -70,6 +73,9 @@
static const struct value_string lm_event_names[] = {
{ LM_E_SCTP_EST_IND, "SCTP-ESTABLISH.ind" },
{ LM_E_ASP_UP_CONF, "ASP-UP.conf" },
+ { LM_E_ASP_UP_IND, "ASP-UP.ind" },
+ { LM_E_ASP_ACT_IND, "ASP-ACT.ind" },
+ { LM_E_ASP_INACT_IND, "ASP-INACT.ind" },
{ LM_E_NOTIFY_IND, "NOTIFY.ind" },
{ LM_E_AS_INACTIVE_IND, "AS-INACTIVE.ind" },
{ LM_E_AS_ACTIVE_IND, "AS-ACTIVE.ind" },
@@ -127,6 +133,28 @@
((struct xua_layer_manager_default_priv
*)(fi->priv))->asp->cfg.T_defs_lm, \
-1)
+#define ENSURE_ROLE_COND(fi, event, cond)
\
+ do {
\
+ struct xua_layer_manager_default_priv *_lmp = fi->priv;
\
+ enum osmo_ss7_asp_role _role = _lmp->asp->cfg.role;
\
+ if (!(cond)) { \
+ LOGPFSML(fi, LOGL_ERROR, "event %s not permitted "
\
+ "in role %s\n",
\
+ osmo_fsm_event_name(fi->fsm, event),
\
+ get_value_string(osmo_ss7_asp_role_names,
_role));\
+ return;
\
+ }
\
+ } while (0)
+
+#define ENSURE_IPSP(fi, event) \
+ ENSURE_ROLE_COND(fi, event, _role == OSMO_SS7_ASP_ROLE_IPSP)
+
+#define ENSURE_ASP_OR_IPSP(fi, event) \
+ ENSURE_ROLE_COND(fi, event, _role == OSMO_SS7_ASP_ROLE_ASP || _role ==
OSMO_SS7_ASP_ROLE_IPSP)
+
+#define ENSURE_SG_OR_IPSP(fi, event) \
+ ENSURE_ROLE_COND(fi, event, _role == OSMO_SS7_ASP_ROLE_SG || _role ==
OSMO_SS7_ASP_ROLE_IPSP)
+
static struct osmo_ss7_as *find_first_as_in_asp(struct osmo_ss7_asp *asp)
{
struct osmo_ss7_as *as;
@@ -167,11 +195,13 @@
switch (event) {
case LM_E_SCTP_EST_IND:
- if (lmp->asp->cfg.role == OSMO_SS7_ASP_ROLE_ASP) {
+ if (lmp->asp->cfg.role == OSMO_SS7_ASP_ROLE_ASP ||
+ lmp->asp->cfg.role == OSMO_SS7_ASP_ROLE_IPSP) {
/* Try to transition to ASP-UP, wait to receive message
for a few seconds */
lm_fsm_state_chg(fi, S_WAIT_ASP_UP);
osmo_fsm_inst_dispatch(lmp->asp->fi,
XUA_ASP_E_M_ASP_UP_REQ, NULL);
}
+ /* role SG: Unimplemented, do nothing, stay in this state
forever. */
break;
}
}
@@ -180,10 +210,20 @@
{
switch (event) {
case LM_E_ASP_UP_CONF:
+ ENSURE_ASP_OR_IPSP(fi, event);
/* ASP is up, wait for some time if any NOTIFY
* indications about AS in this ASP are received */
lm_fsm_state_chg(fi, S_WAIT_NOTIFY);
break;
+ case LM_E_ASP_UP_IND:
+ ENSURE_SG_OR_IPSP(fi, event);
+ /* ASP is up, wait for some time if any NOTIFY
+ * indications about AS in this ASP are received.
+ * SG role: we move to S_WAIT_NOTIFY to actually wait
+ * for ASPIA msg (LM_E_ASP_INACT_IND)
+ */
+ lm_fsm_state_chg(fi, S_WAIT_NOTIFY);
+ break;
}
}
@@ -193,7 +233,14 @@
struct osmo_xlm_prim *oxp = data;
switch (event) {
+ case LM_E_ASP_UP_CONF:
+ ENSURE_ASP_OR_IPSP(fi, event);
+ /* in IPSP, we may receive a ASP-UP ACK for the ASP-UP we sent,
+ * _after_ we received the ASP-UP from the peer in state
+ * WAIT_ASP_UP. Ignore it. */
+ break;
case LM_E_NOTIFY_IND:
+ ENSURE_ASP_OR_IPSP(fi, event);
OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_NOTIFY);
OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION);
@@ -209,13 +256,18 @@
lm_fsm_state_chg(fi, S_ACTIVE);
osmo_fsm_inst_dispatch(lmp->asp->fi,
XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL);
break;
+ case LM_E_ASP_ACT_IND:
+ ENSURE_SG_OR_IPSP(fi, event);
+ lm_fsm_state_chg(fi, S_ACTIVE);
+ break;
case LM_E_AS_INACTIVE_IND:
/* we now know that an AS is associated with this ASP at
* the SG, and that this AS is currently inactive */
/* request the ASP to go into active state (which
* hopefully will bring the AS to active, too) */
lm_fsm_state_chg(fi, S_ACTIVE);
- osmo_fsm_inst_dispatch(lmp->asp->fi,
XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL);
+ if (lmp->asp->cfg.role != OSMO_SS7_ASP_ROLE_SG)
+ osmo_fsm_inst_dispatch(lmp->asp->fi,
XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL);
break;
}
};
@@ -253,6 +305,10 @@
struct osmo_xlm_prim *oxp;
switch (event) {
+ case LM_E_ASP_ACT_IND:
+ /* This may come in IPSP if we received ASPAC from peer before
it answered our ASPAC: */
+ ENSURE_IPSP(fi, event);
+ break;
case LM_E_AS_INACTIVE_IND:
/* request the ASP to go into active state */
osmo_fsm_inst_dispatch(lmp->asp->fi,
XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL);
@@ -337,7 +393,8 @@
.action = lm_idle,
},
[S_WAIT_ASP_UP] = {
- .in_event_mask = S(LM_E_ASP_UP_CONF),
+ .in_event_mask = S(LM_E_ASP_UP_CONF) |
+ S(LM_E_ASP_UP_IND),
.out_state_mask = S(S_IDLE) |
S(S_WAIT_NOTIFY),
.name = "WAIT_ASP_UP",
@@ -345,7 +402,9 @@
},
[S_WAIT_NOTIFY] = {
.in_event_mask = S(LM_E_AS_INACTIVE_IND) |
- S(LM_E_NOTIFY_IND),
+ S(LM_E_ASP_ACT_IND) |
+ S(LM_E_NOTIFY_IND) |
+ S(LM_E_ASP_UP_CONF),
.out_state_mask = S(S_IDLE) |
S(S_RKM_REG) |
S(S_ACTIVE),
@@ -360,7 +419,8 @@
.action = lm_rkm_reg,
},
[S_ACTIVE] = {
- .in_event_mask = S(LM_E_AS_INACTIVE_IND) |
+ .in_event_mask = S(LM_E_ASP_ACT_IND) |
+ S(LM_E_AS_INACTIVE_IND) |
S(LM_E_NOTIFY_IND),
.out_state_mask = S(S_IDLE),
.name = "ACTIVE",
@@ -373,6 +433,9 @@
{ XUA_SAP_LM, OSMO_XLM_PRIM_M_SCTP_ESTABLISH, PRIM_OP_INDICATION,
LM_E_SCTP_EST_IND },
{ XUA_SAP_LM, OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_INDICATION,
LM_E_SCTP_DISC_IND },
{ XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_CONFIRM, LM_E_ASP_UP_CONF
},
+ { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_INDICATION,
LM_E_ASP_UP_IND },
+ { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_INDICATION,
LM_E_ASP_ACT_IND },
+ { 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_AS_INACTIVE, PRIM_OP_INDICATION,
LM_E_AS_INACTIVE_IND },
--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/42074?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: Id9ad8bbfce5cf15fedcba83034ae383e61d3b3a3
Gerrit-Change-Number: 42074
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>