Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/2238

to look at the new patch set (#3).

xua_asp_fsm: Always return BEAT-ACK for BEAT, including BEAT DATA IE

The RFCs say we *must* always respond to the optional heartbeat message,
and we must return a verbatim copy of the heartbeat data IE.

This was discovered (and fix validated) using m3ua-sgp-asptm-v-011 of
Michael Tuexen's m3ua-testtool.

Change-Id: I836e0940a8dbb0f55ddf132202a5f0d51473b82d
---
M src/xua_asp_fsm.c
1 file changed, 23 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/38/2238/3

diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c
index 80faeb2..aafc09f 100644
--- a/src/xua_asp_fsm.c
+++ b/src/xua_asp_fsm.c
@@ -128,7 +128,7 @@
 }
 
 /* ask the xUA implementation to transmit a specific message */
-static int peer_send(struct osmo_fsm_inst *fi, int out_event)
+static int peer_send(struct osmo_fsm_inst *fi, int out_event, struct xua_msg 
*in)
 {
        struct xua_asp_fsm_priv *xafp = fi->priv;
        struct osmo_ss7_asp *asp = xafp->asp;
@@ -168,6 +168,7 @@
                /* RFC3868 Ch. 3.5.6 */
                xua->hdr = XUA_HDR(SUA_MSGC_ASPSM, SUA_ASPSM_BEAT_ACK);
                /* Optional: Heartbeat Data */
+               xua_msg_copy_part(xua, M3UA_IEI_HEARDBT_DATA, in, 
M3UA_IEI_HEARDBT_DATA);
                break;
        case XUA_ASP_E_ASPTM_ASPAC:
                /* RFC3868 Ch. 3.6.1 */
@@ -217,7 +218,7 @@
                osmo_fsm_event_name(fi->fsm, xafp->t_ack.out_event));
 
        /* Re-transmit message */
-       peer_send(fi, xafp->t_ack.out_event);
+       peer_send(fi, xafp->t_ack.out_event, NULL);
 
        /* Re-start the timer */
        osmo_timer_schedule(&xafp->t_ack.timer, XUA_T_ACK_SEC, 0);
@@ -229,7 +230,7 @@
        struct xua_asp_fsm_priv *xafp = fi->priv;
        int rc;
 
-       rc = peer_send(fi, out_event);
+       rc = peer_send(fi, out_event, NULL);
        if (rc < 0)
                return rc;
 
@@ -328,7 +329,7 @@
                        asp->asp_id_present = true;
                }
                /* send ACK */
-               peer_send(fi, XUA_ASP_E_ASPSM_ASPUP_ACK);
+               peer_send(fi, XUA_ASP_E_ASPSM_ASPUP_ACK, NULL);
                /* transition state and inform layer manager */
                osmo_fsm_inst_state_chg(fi, XUA_ASP_S_INACTIVE, 0, 0);
                send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_UP,
@@ -340,7 +341,7 @@
                /* The SGP MUST send an ASP Down Ack message in response
                 * to a received ASP Down message from the ASP even if
                 * the ASP is already marked as ASP-DOWN at the SGP. */
-               peer_send(fi, XUA_ASP_E_ASPSM_ASPDN_ACK);
+               peer_send(fi, XUA_ASP_E_ASPSM_ASPDN_ACK, NULL);
                break;
        }
 }
@@ -401,7 +402,7 @@
                /* only in role SG */
                ENSURE_SG_OR_IPSP(fi, event);
                /* send ACK */
-               peer_send(fi, XUA_ASP_E_ASPTM_ASPAC_ACK);
+               peer_send(fi, XUA_ASP_E_ASPTM_ASPAC_ACK, NULL);
                /* transition state and inform layer manager */
                osmo_fsm_inst_state_chg(fi, XUA_ASP_S_ACTIVE, 0, 0);
                send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_ACTIVE,
@@ -411,7 +412,7 @@
                /* only in role SG */
                ENSURE_SG_OR_IPSP(fi, event);
                /* send ACK */
-               peer_send(fi, XUA_ASP_E_ASPSM_ASPDN_ACK);
+               peer_send(fi, XUA_ASP_E_ASPSM_ASPDN_ACK, NULL);
                /* transition state and inform layer manager */
                osmo_fsm_inst_state_chg(fi, XUA_ASP_S_DOWN, 0, 0);
                send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_DOWN,
@@ -424,7 +425,7 @@
                 * remote ASP is already in the ASP-INACTIVE state, an
                 * ASP Up Ack message is returned and no further action
                 * is taken. */
-               peer_send(fi, XUA_ASP_E_ASPSM_ASPUP_ACK);
+               peer_send(fi, XUA_ASP_E_ASPSM_ASPUP_ACK, NULL);
                break;
        }
 }
@@ -470,7 +471,7 @@
                /* only in role SG */
                ENSURE_SG_OR_IPSP(fi, event);
                /* send ACK */
-               peer_send(fi, XUA_ASP_E_ASPTM_ASPIA_ACK);
+               peer_send(fi, XUA_ASP_E_ASPTM_ASPIA_ACK, NULL);
                /* transition state and inform layer manager */
                osmo_fsm_inst_state_chg(fi, XUA_ASP_S_INACTIVE, 0, 0);
                send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_INACTIVE,
@@ -480,7 +481,7 @@
                /* only in role SG */
                ENSURE_SG_OR_IPSP(fi, event);
                /* send ACK */
-               peer_send(fi, XUA_ASP_E_ASPSM_ASPDN_ACK);
+               peer_send(fi, XUA_ASP_E_ASPSM_ASPDN_ACK, NULL);
                /* transition state and inform layer manager */
                osmo_fsm_inst_state_chg(fi, XUA_ASP_S_DOWN, 0, 0);
                send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_DOWN,
@@ -508,12 +509,21 @@
 
 static void xua_asp_allstate(struct osmo_fsm_inst *fi, uint32_t event, void 
*data)
 {
+       struct xua_msg *xua;
+
        switch (event) {
        case XUA_ASP_E_SCTP_COMM_DOWN_IND:
        case XUA_ASP_E_SCTP_RESTART_IND:
                osmo_fsm_inst_state_chg(fi, XUA_ASP_S_DOWN, 0, 0);
                send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_DOWN,
                                     PRIM_OP_INDICATION);
+               break;
+       case XUA_ASP_E_ASPSM_BEAT:
+               xua = data;
+               peer_send(fi, XUA_ASP_E_ASPSM_BEAT_ACK, xua);
+               break;
+       case XUA_ASP_E_ASPSM_BEAT_ACK:
+               /* FIXME: stop timer, if any */
                break;
        default:
                break;
@@ -577,7 +587,9 @@
        .log_subsys = DLSS7,
        .event_names = xua_asp_event_names,
        .allstate_event_mask = S(XUA_ASP_E_SCTP_COMM_DOWN_IND) |
-                              S(XUA_ASP_E_SCTP_RESTART_IND),
+                              S(XUA_ASP_E_SCTP_RESTART_IND) |
+                              S(XUA_ASP_E_ASPSM_BEAT) |
+                              S(XUA_ASP_E_ASPSM_BEAT_ACK),
        .allstate_action = xua_asp_allstate,
 };
 

-- 
To view, visit https://gerrit.osmocom.org/2238
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I836e0940a8dbb0f55ddf132202a5f0d51473b82d
Gerrit-PatchSet: 3
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder

Reply via email to