Change in osmo-msc[master]: libmsc/gsm_09_11.c: implement guard timer for SS sessions

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

Vadim Yanitskiy gerrit-no-reply at lists.osmocom.org
Wed Nov 28 19:20:38 UTC 2018


Vadim Yanitskiy has uploaded this change for review. ( https://gerrit.osmocom.org/11992


Change subject: libmsc/gsm_09_11.c: implement guard timer for SS sessions
......................................................................

libmsc/gsm_09_11.c: implement guard timer for SS sessions

It may happen that either the MS or an ESME would become unresponsive,
e.g. due to a bug, or dropped message. In such cases, the
corresponding transaction will remain unfreed forever.

This change introduces a guard timer, that prevents keeping
'stalled' SS sessions forever. As soon as it expires, both
sides (i.e. MS and ESME) are getting notified, and the
transaction is being released.

By default, the timer expires after 255 seconds. As soon as
either the MS, or an ESME initiates any activity, the timer
is being rescheduled.

The timer can be configured from the VTY:

  msc
   ss-guard-timeout 255

or disabled by setting 0.

Change-Id: Icf4d87c45e90324764073e8230e0fb9cb96dd9cb
Related Change-Id: (TTCN) I3e1791773d56617172ae27a46889a1ae4d400e2f
Related: OS#3655
---
M include/osmocom/msc/gsm_data.h
M include/osmocom/msc/transaction.h
M src/libmsc/gsm_09_11.c
M src/libmsc/msc_vty.c
M src/libmsc/osmo_msc.c
5 files changed, 75 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/92/11992/1

diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h
index 085248c..4e338c0 100644
--- a/include/osmocom/msc/gsm_data.h
+++ b/include/osmocom/msc/gsm_data.h
@@ -338,6 +338,8 @@
 
 	/* Global MNCC guard timer value */
 	int mncc_guard_timeout;
+	/* SS session guard timer value */
+	int ss_guard_timeout;
 
 	struct {
 		struct mgcp_client_conf conf;
diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h
index b7d7971..05fcba1 100644
--- a/include/osmocom/msc/transaction.h
+++ b/include/osmocom/msc/transaction.h
@@ -84,6 +84,8 @@
 			 * a subscriber after successful Paging Response
 			 */
 			struct msgb *msg;
+			/* Time-out of inactivity when we will delete the session */
+			struct osmo_timer_list timeout;
 		} ss;
 	};
 
diff --git a/src/libmsc/gsm_09_11.c b/src/libmsc/gsm_09_11.c
index b863ce8..34c7248 100644
--- a/src/libmsc/gsm_09_11.c
+++ b/src/libmsc/gsm_09_11.c
@@ -52,6 +52,36 @@
 /* FIXME: choose a proper range */
 static uint32_t new_callref = 0x20000001;
 
+/* SS/USSD session time-out handler */
+static void ss_session_timeout(void *_trans)
+{
+	struct gsm_trans *trans = (struct gsm_trans *) _trans;
+	struct osmo_gsup_message gsup_msg = { 0 };
+
+	LOGP(DMM, LOGL_NOTICE, "SS/USSD session (trans=%p, callref=%x) "
+		"timeout, destroying\n", trans, trans->callref);
+
+	/* Release connection (if any) with subscriber */
+	if (trans->conn != NULL) {
+		msc_send_ussd_release_complete(trans->conn,
+			trans->transaction_id); /* TODO: specify some cause! */
+	}
+
+	/* Notify EUSE (i.e. terminate GSUP session)
+	 * FIXME: use a proper cause value */
+	gsup_msg.message_type = OSMO_GSUP_MSGT_PROC_SS_ERROR;
+	OSMO_STRLCPY_ARRAY(gsup_msg.imsi, trans->vsub->imsi);
+
+	gsup_msg.session_state = OSMO_GSUP_SESSION_STATE_END;
+	gsup_msg.session_id = trans->callref;
+	gsup_msg.cause = GMM_CAUSE_NET_FAIL;
+
+	osmo_gsup_msg_enc_send(trans->net->vlr->gsup_client, &gsup_msg);
+
+	/* Finally, release this transaction */
+	trans_free(trans);
+}
+
 /* Entry point for call independent MO SS messages */
 int gsm0911_rcv_nc_ss(struct gsm_subscriber_connection *conn, struct msgb *msg)
 {
@@ -110,6 +140,9 @@
 			return -ENOMEM;
 		}
 
+		/* Init self-destruction timer */
+		osmo_timer_setup(&trans->ss.timeout, ss_session_timeout, trans);
+
 		/* Count active NC SS/USSD sessions */
 		osmo_counter_inc(conn->network->active_nc_ss);
 
@@ -118,6 +151,12 @@
 		cm_service_request_concludes(conn, msg);
 	}
 
+	/* (Re)schedule self-destruction timer */
+	if (conn->network->ss_guard_timeout > 0) {
+		osmo_timer_schedule(&trans->ss.timeout,
+			conn->network->ss_guard_timeout, 0);
+	}
+
 	/* Attempt to extract Facility IE */
 	rc = gsm0480_extract_ie_by_tag(gh, msgb_l3len(msg),
 		&facility_ie, &facility_ie_len, GSM0480_IE_FACILITY);
@@ -235,6 +274,12 @@
 		transt->conn = msc_subscr_conn_get(conn, MSC_CONN_USE_TRANS_NC_SS);
 		transt->paging_request = NULL;
 
+		/* (Re)schedule self-destruction timer */
+		if (conn->network->ss_guard_timeout > 0) {
+			osmo_timer_schedule(&transt->ss.timeout,
+				conn->network->ss_guard_timeout, 0);
+		}
+
 		/* Send stored message */
 		ss_msg = transt->ss.msg;
 		OSMO_ASSERT(ss_msg);
@@ -322,6 +367,9 @@
 	}
 	trans->transaction_id = tid;
 
+	/* Init inactivity watchdog */
+	osmo_timer_setup(&trans->ss.timeout, ss_session_timeout, trans);
+
 	/* Attempt to find connection */
 	conn = connection_for_subscr(vsub);
 	if (conn) {
@@ -375,6 +423,9 @@
 	if (trans->ss.msg != NULL)
 		msgb_free(trans->ss.msg);
 
+	/* Stop self-destruction time-out */
+	osmo_timer_del(&trans->ss.timeout);
+
 	/* One session less */
 	osmo_counter_dec(trans->net->active_nc_ss);
 }
@@ -424,6 +475,12 @@
 			return 0;
 	}
 
+	/* (Re)schedule self-destruction timer */
+	if (net->ss_guard_timeout > 0) {
+		osmo_timer_schedule(&trans->ss.timeout,
+			net->ss_guard_timeout, 0);
+	}
+
 	/* Allocate and prepare a new MT message */
 	ss_msg = gsm48_msgb_alloc_name("GSM 04.08 SS/USSD");
 	gh = (struct gsm48_hdr *) msgb_push(ss_msg, sizeof(*gh));
diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c
index 245a227..c9abe1c 100644
--- a/src/libmsc/msc_vty.c
+++ b/src/libmsc/msc_vty.c
@@ -346,6 +346,16 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN(cfg_msc_ss_guard_timeout,
+      cfg_msc_ss_guard_timeout_cmd,
+      "ss-guard-timeout <0-255>",
+      "Set guard timer for SS/USSD session activity\n"
+      "guard timer value (sec.), or 0 to disable")
+{
+	gsmnet->ss_guard_timeout = atoi(argv[0]);
+	return CMD_SUCCESS;
+}
+
 DEFUN(cfg_msc_assign_tmsi, cfg_msc_assign_tmsi_cmd,
       "assign-tmsi",
       "Assign TMSI during Location Updating.\n")
@@ -436,6 +446,8 @@
 	vty_out(vty, "msc%s", VTY_NEWLINE);
 	vty_out(vty, " mncc-guard-timeout %i%s",
 		gsmnet->mncc_guard_timeout, VTY_NEWLINE);
+	vty_out(vty, " ss-guard-timeout %i%s",
+		gsmnet->ss_guard_timeout, VTY_NEWLINE);
 	vty_out(vty, " %sassign-tmsi%s",
 		gsmnet->vlr->cfg.assign_tmsi? "" : "no ", VTY_NEWLINE);
 
@@ -1448,6 +1460,7 @@
 	install_node(&msc_node, config_write_msc);
 	install_element(MSC_NODE, &cfg_msc_assign_tmsi_cmd);
 	install_element(MSC_NODE, &cfg_msc_mncc_guard_timeout_cmd);
+	install_element(MSC_NODE, &cfg_msc_ss_guard_timeout_cmd);
 	install_element(MSC_NODE, &cfg_msc_no_assign_tmsi_cmd);
 	install_element(MSC_NODE, &cfg_msc_auth_tuple_max_reuse_count_cmd);
 	install_element(MSC_NODE, &cfg_msc_auth_tuple_reuse_on_error_cmd);
diff --git a/src/libmsc/osmo_msc.c b/src/libmsc/osmo_msc.c
index f2c84e6..bd9e96f 100644
--- a/src/libmsc/osmo_msc.c
+++ b/src/libmsc/osmo_msc.c
@@ -55,6 +55,7 @@
 	net->t3212 = 5;
 
 	net->mncc_guard_timeout = 180;
+	net->ss_guard_timeout = 255;
 
 	net->paging_response_timer = MSC_PAGING_RESPONSE_TIMER_DEFAULT;
 

-- 
To view, visit https://gerrit.osmocom.org/11992
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Icf4d87c45e90324764073e8230e0fb9cb96dd9cb
Gerrit-Change-Number: 11992
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181128/5545ef36/attachment.htm>


More information about the gerrit-log mailing list