SS/USSD: add IUSEs to enable / disable UMTS

Change-Id: Icf85ec8dd71813a9bbf359b9011456844f398337
diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c
index 753e48b..0eab395 100644
--- a/src/hlr_ussd.c
+++ b/src/hlr_ussd.c
@@ -356,6 +356,58 @@
 	return rc;
 }
 
+static int handle_ussd_umts_on(struct osmo_gsup_conn *conn, struct ss_session *ss,
+			       const struct osmo_gsup_message *gsup,
+			       const struct ss_request *req)
+{
+	struct hlr_subscriber subscr;
+	int rc;
+
+	rc = db_subscr_get_by_imsi(g_hlr->dbc, ss->imsi, &subscr);
+	switch (rc) {
+	case 0:
+		hlr_subscr_rat_flag(g_hlr, &subscr, OSMO_RAT_UTRAN_IU, true);
+		rc = ss_tx_ussd_7bit(ss, true, req->invoke_id,
+			"Enabled UTRAN-Iu (3G)");
+		break;
+	case -ENOENT:
+		rc = ss_tx_error(ss, true, GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER);
+		break;
+	case -EIO:
+	default:
+		rc = ss_tx_error(ss, true, GSM0480_ERR_CODE_SYSTEM_FAILURE);
+		break;
+	}
+
+	return rc;
+}
+
+static int handle_ussd_umts_off(struct osmo_gsup_conn *conn, struct ss_session *ss,
+				const struct osmo_gsup_message *gsup,
+				const struct ss_request *req)
+{
+	struct hlr_subscriber subscr;
+	int rc;
+
+	rc = db_subscr_get_by_imsi(g_hlr->dbc, ss->imsi, &subscr);
+	switch (rc) {
+	case 0:
+		hlr_subscr_rat_flag(g_hlr, &subscr, OSMO_RAT_UTRAN_IU, false);
+		rc = ss_tx_ussd_7bit(ss, true, req->invoke_id,
+			"Disabled UTRAN-Iu (3G)");
+		break;
+	case -ENOENT:
+		rc = ss_tx_error(ss, true, GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER);
+		break;
+	case -EIO:
+	default:
+		rc = ss_tx_error(ss, true, GSM0480_ERR_CODE_SYSTEM_FAILURE);
+		break;
+	}
+
+	return rc;
+}
+
 static const struct hlr_iuse hlr_iuses[] = {
 	{
 		.name = "own-msisdn",
@@ -369,6 +421,14 @@
 		.name = "get-ran",
 		.handle_ussd = handle_ussd_get_ran,
 	},
+	{
+		.name = "umts-on",
+		.handle_ussd = handle_ussd_umts_on,
+	},
+	{
+		.name = "umts-off",
+		.handle_ussd = handle_ussd_umts_off,
+	},
 };
 
 const struct hlr_iuse *iuse_find(const char *name)
diff --git a/src/hlr_vty.c b/src/hlr_vty.c
index 9ecf8a3..c373d3a 100644
--- a/src/hlr_vty.c
+++ b/src/hlr_vty.c
@@ -133,11 +133,13 @@
 #define UROUTE_STR "Routing Configuration\n"
 #define PREFIX_STR "Prefix-Matching Route\n" "USSD Prefix\n"
 
-#define INT_CHOICE "(own-msisdn|own-imsi|get-ran)"
+#define INT_CHOICE "(own-msisdn|own-imsi|get-ran|umts-on|umts-off)"
 #define INT_STR "Internal USSD Handler\n" \
 		"Respond with subscribers' own MSISDN\n" \
 		"Respond with subscribers' own IMSI\n" \
-		"Respond with available RAN types\n"
+		"Respond with available RAN types\n" \
+		"Enable UMTS service\n" \
+		"Disable UMTS service\n"
 
 #define EXT_STR "External USSD Handler\n" \
 		"Name of External USSD Handler (IPA CCM ID)\n"