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) |

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

Reply via email to