aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2018-12-27 08:15:00 +0700
committerNeels Hofmeyr <neels@hofmeyr.de>2019-12-25 19:09:45 +0100
commite6751dd207889e48f8a2608fe9064094d2928454 (patch)
tree3288d08eef262bc0d5bf3704d1b435b43df29fc3
parente8b7b8634bded790aacda329b9f3c9d03b1efda7 (diff)
SS/USSD: add IUSEs to enable / disable UMTS
-rw-r--r--src/hlr_ussd.c60
-rw-r--r--src/hlr_vty.c6
2 files changed, 64 insertions, 2 deletions
diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c
index cb3031a..9cd2bce 100644
--- a/src/hlr_ussd.c
+++ b/src/hlr_ussd.c
@@ -409,6 +409,58 @@ static int handle_ussd_get_ran(struct ss_session *ss,
return rc;
}
+static int handle_ussd_umts_on(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_to_ms_ussd_7bit(ss, true, req->invoke_id,
+ "Enabled UTRAN-Iu (3G)");
+ break;
+ case -ENOENT:
+ rc = ss_tx_to_ms_error(ss, true, GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER);
+ break;
+ case -EIO:
+ default:
+ rc = ss_tx_to_ms_error(ss, true, GSM0480_ERR_CODE_SYSTEM_FAILURE);
+ break;
+ }
+
+ return rc;
+}
+
+static int handle_ussd_umts_off(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_to_ms_ussd_7bit(ss, true, req->invoke_id,
+ "Disabled UTRAN-Iu (3G)");
+ break;
+ case -ENOENT:
+ rc = ss_tx_to_ms_error(ss, true, GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER);
+ break;
+ case -EIO:
+ default:
+ rc = ss_tx_to_ms_error(ss, true, GSM0480_ERR_CODE_SYSTEM_FAILURE);
+ break;
+ }
+
+ return rc;
+}
+
static const struct hlr_iuse hlr_iuses[] = {
{
.name = "own-msisdn",
@@ -422,6 +474,14 @@ static const struct hlr_iuse hlr_iuses[] = {
.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 cdc5147..8a69f70 100644
--- a/src/hlr_vty.c
+++ b/src/hlr_vty.c
@@ -174,11 +174,13 @@ DEFUN(cfg_hlr_gsup_ipa_name,
#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"