[PATCH] libosmo-sccp[master]: xua_asp_fsm: Always return BEAT-ACK for BEAT, including BEAT...

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.org
Sun Apr 9 16:56:58 UTC 2017


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 (#2).

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/2

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: 2
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



More information about the gerrit-log mailing list