[PATCH] osmo-msc[master]: libmsc: Close connection after sending a service reject

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

daniel gerrit-no-reply at lists.osmocom.org
Thu Feb 15 16:53:47 UTC 2018


Review at  https://gerrit.osmocom.org/6503

libmsc: Close connection after sending a service reject

After we send an MM service reject we should close the connection. Make
sure that we have an fsm instance in any case and signal it to close the
connection right away - not just after a timeout.

Change-Id: Idfa39fdbe5bb764f8ea2bbf8c5442e15e01cadbb
---
M src/libmsc/gsm_04_08.c
1 file changed, 41 insertions(+), 23 deletions(-)


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

diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index b928171..d9e147f 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -670,6 +670,18 @@
 	return conn->network->vlr->ops.tx_cm_serv_acc(conn);
 }
 
+int msc_gsm48_tx_mm_serv_rej_and_close(struct gsm_subscriber_connection *conn,
+				enum gsm48_reject_value cause)
+{
+	int rc;
+
+	rc = msc_gsm48_tx_mm_serv_rej(conn, cause);
+	if (conn->conn_fsm)
+		osmo_fsm_inst_dispatch(conn->conn_fsm, SUBSCR_CONN_E_CN_CLOSE, &cause);
+
+	return rc;
+}
+
 /*
  * Handle CM Service Requests
  * a) Verify that the packet is long enough to contain the information
@@ -688,6 +700,7 @@
 	struct gsm_network *net = conn->network;
 	uint8_t mi_type;
 	char mi_string[GSM48_MI_SIZE];
+	char *cid;
 
 	struct gsm48_hdr *gh = msgb_l3(msg);
 	struct gsm48_service_request *req =
@@ -706,15 +719,34 @@
 	lai.lac = conn->lac;
 
 	DEBUGP(DMM, "<- CM SERVICE REQUEST ");
+	if (conn->conn_fsm) {
+		if (msc_subscr_conn_is_accepted(conn))
+			return cm_serv_reuse_conn(conn, mi-1);
+		LOGP(DMM, LOGL_ERROR, "%s: connection already in use\n",
+		     vlr_subscr_name(conn->vsub));
+		msc_vlr_tx_cm_serv_rej(conn, VLR_PR_ARQ_RES_UNKNOWN_ERROR);
+		return -EINVAL;
+	}
+
+	cid = msc_subscr_conn_get_conn_id(conn);
+	rc = msc_create_conn_fsm(conn, cid);
+	talloc_free(cid);
+
+	if (rc) {
+		msc_vlr_tx_cm_serv_rej(conn, VLR_PR_ARQ_RES_UNKNOWN_ERROR);
+		/* logging already happened in msc_create_conn_fsm() */
+		return rc;
+	}
+
 	if (msg->data_len < sizeof(struct gsm48_service_request*)) {
 		DEBUGPC(DMM, "wrong sized message\n");
-		return msc_gsm48_tx_mm_serv_rej(conn,
+		return msc_gsm48_tx_mm_serv_rej_and_close(conn,
 						GSM48_REJECT_INCORRECT_MESSAGE);
 	}
 
 	if (msg->data_len < req->mi_len + 6) {
 		DEBUGPC(DMM, "does not fit in packet\n");
-		return msc_gsm48_tx_mm_serv_rej(conn,
+		return msc_gsm48_tx_mm_serv_rej_and_close(conn,
 						GSM48_REJECT_INCORRECT_MESSAGE);
 	}
 
@@ -722,6 +754,8 @@
 	mi_type = mi[0] & GSM_MI_TYPE_MASK;
 	DEBUGPC(DMM, "serv_type=0x%02x MI(%s)=%s\n",
 		req->cm_service_type, gsm48_mi_type_name(mi_type), mi_string);
+
+	osmo_fsm_inst_update_id(conn->conn_fsm, mi_string);
 
 	switch (mi_type) {
 	case GSM_MI_TYPE_IMSI:
@@ -732,12 +766,12 @@
 		if (req->cm_service_type == GSM48_CMSERV_EMERGENCY) {
 			/* We don't do emergency calls by IMEI */
 			LOGP(DMM, LOGL_NOTICE, "<- CM SERVICE REQUEST(IMEI=%s) rejected\n", mi_string);
-			return msc_gsm48_tx_mm_serv_rej(conn, GSM48_REJECT_IMEI_NOT_ACCEPTED);
+			return msc_gsm48_tx_mm_serv_rej_and_close(conn, GSM48_REJECT_IMEI_NOT_ACCEPTED);
 		}
 		/* fall-through for non-emergency setup */
 	default:
 		DEBUGPC(DMM, "mi_type is not expected: %d\n", mi_type);
-		return msc_gsm48_tx_mm_serv_rej(conn,
+		return msc_gsm48_tx_mm_serv_rej_and_close(conn,
 						GSM48_REJECT_INCORRECT_MESSAGE);
 	}
 
@@ -749,28 +783,12 @@
 		/* continue below */
 		break;
 	default:
-		return msc_gsm48_tx_mm_serv_rej(conn, GSM48_REJECT_SRV_OPT_NOT_SUPPORTED);
+		return msc_gsm48_tx_mm_serv_rej_and_close(conn, GSM48_REJECT_SRV_OPT_NOT_SUPPORTED);
 	}
 
 	osmo_signal_dispatch(SS_SUBSCR, S_SUBSCR_IDENTITY, (classmark2 + classmark2_len));
 	memcpy(conn->classmark.classmark2, classmark2, classmark2_len);
 	conn->classmark.classmark2_len = classmark2_len;
-
-	if (conn->conn_fsm) {
-		if (msc_subscr_conn_is_accepted(conn))
-			return cm_serv_reuse_conn(conn, mi-1);
-		LOGP(DMM, LOGL_ERROR, "%s: connection already in use\n",
-		     vlr_subscr_name(conn->vsub));
-		msc_vlr_tx_cm_serv_rej(conn, VLR_PR_ARQ_RES_UNKNOWN_ERROR);
-		return -EINVAL;
-	}
-
-	rc = msc_create_conn_fsm(conn, mi_string);
-	if (rc) {
-		msc_vlr_tx_cm_serv_rej(conn, VLR_PR_ARQ_RES_UNKNOWN_ERROR);
-		/* logging already happened in msc_create_conn_fsm() */
-		return rc;
-	}
 
 	is_utran = (conn->via_ran == RAN_UTRAN_IU);
 	vlr_proc_acc_req(conn->conn_fsm,
@@ -804,7 +822,7 @@
 	DEBUGP(DMM, "<- CM RE-ESTABLISH REQUEST MI(%s)=%s\n", gsm48_mi_type_name(mi_type), mi_string);
 
 	/* we don't support CM call re-establishment */
-	return msc_gsm48_tx_mm_serv_rej(conn, GSM48_REJECT_SRV_OPT_NOT_SUPPORTED);
+	return msc_gsm48_tx_mm_serv_rej_and_close(conn, GSM48_REJECT_SRV_OPT_NOT_SUPPORTED);
 }
 
 static int gsm48_rx_mm_imsi_detach_ind(struct gsm_subscriber_connection *conn, struct msgb *msg)
@@ -3606,7 +3624,7 @@
 		break;
 	};
 
-	return msc_gsm48_tx_mm_serv_rej(conn, cause);
+	return msc_gsm48_tx_mm_serv_rej_and_close(conn, cause);
 }
 
 /* For msc_vlr_set_ciph_mode() */

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Idfa39fdbe5bb764f8ea2bbf8c5442e15e01cadbb
Gerrit-PatchSet: 1
Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Owner: daniel <dwillmann at sysmocom.de>



More information about the gerrit-log mailing list