pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-sigtran/+/42073?usp=email )
Change subject: xua_asp_fsm: Improvements to support IPSP ......................................................................
xua_asp_fsm: Improvements to support IPSP
Change-Id: Ia268848ee9bb2f97a47ba9be60ecd16fbeb4fb40 --- M src/xua_asp_fsm.c 1 file changed, 30 insertions(+), 17 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran refs/changes/73/42073/1
diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c index 580a298..d3a7410 100644 --- a/src/xua_asp_fsm.c +++ b/src/xua_asp_fsm.c @@ -510,33 +510,27 @@ } }
-#define ENSURE_ASP_OR_IPSP(fi, event) \ +#define ENSURE_ROLE_COND(fi, event, cond) \ do { \ struct xua_asp_fsm_priv *_xafp = fi->priv; \ enum osmo_ss7_asp_role _role = _xafp->asp->cfg.role; \ - if (_role != OSMO_SS7_ASP_ROLE_ASP && \ - _role != OSMO_SS7_ASP_ROLE_IPSP) { \ + 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) + } while (0)
-#define ENSURE_SG_OR_IPSP(fi, event) \ - do { \ - struct xua_asp_fsm_priv *_xafp = fi->priv; \ - enum osmo_ss7_asp_role _role = _xafp->asp->cfg.role; \ - if (_role != OSMO_SS7_ASP_ROLE_SG && \ - _role != OSMO_SS7_ASP_ROLE_IPSP) { \ - 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)
/*************** @@ -640,6 +634,7 @@ struct xua_asp_fsm_priv *xafp = fi->priv; struct osmo_ss7_asp *asp = xafp->asp; struct osmo_ss7_as *as; + struct xua_msg_part *asp_id_ie; struct xua_msg *xua_in; uint32_t traf_mode = 0; struct xua_msg_part *part; @@ -655,6 +650,17 @@ /* send M3UA_MSGT_ASPSM_ASPDN and start t_ack */ peer_send_and_start_t_ack(fi, XUA_ASP_E_ASPSM_ASPDN); break; + case XUA_ASP_E_ASPSM_ASPUP_ACK: + /* This may come in IPSP if we received ASPUP from peer before it answered our ASPUP: */ + ENSURE_IPSP(fi, event); + /* Optional ASP Identifier */ + if ((asp_id_ie = xua_msg_find_tag(data, SUA_IEI_ASP_ID))) { + asp->remote_asp_id = xua_msg_part_get_u32(asp_id_ie); + asp->remote_asp_id_present = true; + } + /* inform layer manager */ + send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_CONFIRM); + break; case XUA_ASP_E_ASPTM_ASPAC_ACK: /* only in role ASP */ ENSURE_ASP_OR_IPSP(fi, event); @@ -776,6 +782,11 @@ struct xua_msg *xua_in; check_stop_t_ack(fi, event); switch (event) { + case XUA_ASP_E_ASPTM_ASPAC_ACK: + /* This may come in IPSP if we received ASPAC from peer before it answered our ASPAC: */ + ENSURE_IPSP(fi, event); + send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_CONFIRM); + break; case XUA_ASP_E_ASPSM_ASPDN_ACK: /* only in role ASP */ ENSURE_ASP_OR_IPSP(fi, event); @@ -913,6 +924,7 @@ [XUA_ASP_S_INACTIVE] = { .in_event_mask = S(XUA_ASP_E_M_ASP_ACTIVE_REQ) | S(XUA_ASP_E_M_ASP_DOWN_REQ) | + S(XUA_ASP_E_ASPSM_ASPUP_ACK) | S(XUA_ASP_E_ASPTM_ASPAC) | S(XUA_ASP_E_ASPTM_ASPAC_ACK) | S(XUA_ASP_E_ASPTM_ASPIA) | @@ -929,6 +941,7 @@ .in_event_mask = S(XUA_ASP_E_ASPSM_ASPDN) | S(XUA_ASP_E_ASPSM_ASPDN_ACK) | S(XUA_ASP_E_ASPSM_ASPUP) | + S(XUA_ASP_E_ASPTM_ASPAC_ACK) | S(XUA_ASP_E_ASPTM_ASPIA) | S(XUA_ASP_E_ASPTM_ASPIA_ACK) | S(XUA_ASP_E_ASPTM_ASPAC) |