This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has submitted this change and it was merged.
Change subject: xua_asp_fsm: Always return BEAT-ACK for BEAT, including BEAT DATA IE
......................................................................
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(-)
Approvals:
Harald Welte: Looks good to me, approved
Jenkins Builder: Verified
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: merged
Gerrit-Change-Id: I836e0940a8dbb0f55ddf132202a5f0d51473b82d
Gerrit-PatchSet: 5
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder