aboutsummaryrefslogtreecommitdiffstats
path: root/src/hlr_ussd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hlr_ussd.c')
-rw-r--r--src/hlr_ussd.c68
1 files changed, 66 insertions, 2 deletions
diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c
index 7ca882d..de4d34b 100644
--- a/src/hlr_ussd.c
+++ b/src/hlr_ussd.c
@@ -373,14 +373,17 @@ static int handle_ussd_get_ran(struct osmo_gsup_conn *conn, struct ss_session *s
rat = "2G";
else if (!strcmp(subscr.last_lu_rat, "UTRAN-Iu"))
rat = "3G";
+ else if (!strcmp(subscr.last_lu_rat, "EUTRAN-SGs"))
+ rat = "4G";
else
rat = subscr.last_lu_rat;
snprintf(response, sizeof(response),
- "Now on %s. Available:%s%s.",
+ "Now on %s. Available:%s%s%s.",
rat,
subscr.rat_types[OSMO_RAT_GERAN_A]? " 2G" : "",
- subscr.rat_types[OSMO_RAT_UTRAN_IU]? " 3G" : "");
+ subscr.rat_types[OSMO_RAT_UTRAN_IU]? " 3G" : "",
+ subscr.rat_types[OSMO_RAT_EUTRAN_SGS]? " 4G" : "");
rc = ss_tx_ussd_7bit(ss, true, req->invoke_id, response);
break;
@@ -500,6 +503,59 @@ static int handle_ussd_umts_off(struct osmo_gsup_conn *conn, struct ss_session *
return rc;
}
+static int handle_ussd_lte_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_EUTRAN_SGS, true);
+ rc = ss_tx_ussd_7bit(ss, true, req->invoke_id,
+ "Enabled EUTRAN-SGs (4G)");
+ 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_lte_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_EUTRAN_SGS, false);
+ rc = ss_tx_ussd_7bit(ss, true, req->invoke_id,
+ "Disabled EUTRAN-SGs (4G)");
+ 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",
@@ -529,6 +585,14 @@ static const struct hlr_iuse hlr_iuses[] = {
.name = "umts-off",
.handle_ussd = handle_ussd_umts_off,
},
+ {
+ .name = "lte-on",
+ .handle_ussd = handle_ussd_lte_on,
+ },
+ {
+ .name = "lte-off",
+ .handle_ussd = handle_ussd_lte_off,
+ },
};
const struct hlr_iuse *iuse_find(const char *name)