aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/examples/osmo-hlr.cfg2
-rw-r--r--sql/hlr.sql2
-rw-r--r--src/hlr_ussd.c68
-rw-r--r--src/hlr_vty.c8
-rw-r--r--src/hlr_vty_subscr.c5
5 files changed, 78 insertions, 7 deletions
diff --git a/doc/examples/osmo-hlr.cfg b/doc/examples/osmo-hlr.cfg
index dc683d9..dee200b 100644
--- a/doc/examples/osmo-hlr.cfg
+++ b/doc/examples/osmo-hlr.cfg
@@ -29,3 +29,5 @@ hlr
ussd route prefix *#201# internal gsm-on
ussd route prefix *#300# internal umts-off
ussd route prefix *#301# internal umts-on
+ ussd route prefix *#400# internal lte-off
+ ussd route prefix *#401# internal lte-on
diff --git a/sql/hlr.sql b/sql/hlr.sql
index 209deb0..5c470f4 100644
--- a/sql/hlr.sql
+++ b/sql/hlr.sql
@@ -97,7 +97,7 @@ CREATE TABLE ind (
-- If a subscriber has no entry, that means that all RATs are allowed (backwards compat).
CREATE TABLE subscriber_rat (
subscriber_id INTEGER, -- subscriber.id
- rat TEXT CHECK(rat in ('GERAN-A', 'UTRAN-Iu')) NOT NULL, -- Radio Access Technology, see enum ran_type
+ rat TEXT CHECK(rat in ('GERAN-A', 'UTRAN-Iu','EUTRAN-SGs')) NOT NULL, -- Radio Access Technology, see enum ran_type
allowed BOOLEAN CHECK(allowed in (0, 1)) NOT NULL DEFAULT 0
);
diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c
index 8a1a0a6..437f8fc 100644
--- a/src/hlr_ussd.c
+++ b/src/hlr_ussd.c
@@ -391,14 +391,17 @@ static int handle_ussd_get_ran(struct ss_session *ss,
rat = "2G";
else if (!strcmp(subscr.last_lu_rat_cs, "UTRAN-Iu"))
rat = "3G";
+ else if (!strcmp(subscr.last_lu_rat_cs, "EUTRAN-SGs"))
+ rat = "4G";
else
rat = subscr.last_lu_rat_cs;
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_to_ms_ussd_7bit(ss, true, req->invoke_id, response);
break;
@@ -518,6 +521,59 @@ static int handle_ussd_umts_off(struct ss_session *ss,
return rc;
}
+static int handle_ussd_lte_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_EUTRAN_SGS, true);
+ rc = ss_tx_to_ms_ussd_7bit(ss, true, req->invoke_id,
+ "Enabled EUTRAN-SGs (4G)");
+ 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_lte_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_EUTRAN_SGS, false);
+ rc = ss_tx_to_ms_ussd_7bit(ss, true, req->invoke_id,
+ "Disabled EUTRAN-SGs (4G)");
+ 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",
@@ -547,6 +603,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)
diff --git a/src/hlr_vty.c b/src/hlr_vty.c
index 914bf69..8b1f71e 100644
--- a/src/hlr_vty.c
+++ b/src/hlr_vty.c
@@ -174,13 +174,17 @@ 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|gsm-on|gsm-off|umts-on|umts-off)"
+#define INT_CHOICE "(own-msisdn|own-imsi|get-ran|gsm-on|gsm-off|umts-on|umts-off|lte-on|lte-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" \
+ "Enable GSM service\n" \
+ "Disable GSM service\n" \
"Enable UMTS service\n" \
- "Disable UMTS service\n"
+ "Disable UMTS service\n" \
+ "Enable LTE service\n" \
+ "Disable LTE service\n"
#define EXT_STR "External USSD Handler\n" \
"Name of External USSD Handler (IPA CCM ID)\n"
diff --git a/src/hlr_vty_subscr.c b/src/hlr_vty_subscr.c
index a42e072..5311c13 100644
--- a/src/hlr_vty_subscr.c
+++ b/src/hlr_vty_subscr.c
@@ -641,11 +641,12 @@ DEFUN(subscriber_nam,
DEFUN(subscriber_rat,
subscriber_rat_cmd,
- SUBSCR_UPDATE "rat (geran-a|utran-iu) (allowed|forbidden)",
+ SUBSCR_UPDATE "rat (geran-a|utran-iu|eutran-sgs) (allowed|forbidden)",
SUBSCR_UPDATE_HELP
"Allow or forbid specific Radio Access Types\n"
"Set access to GERAN-A\n"
"Set access to UTRAN-Iu\n"
+ "Set access to EUTRAN-SGs\n"
"Allow access\n"
"Forbid access\n")
{
@@ -662,7 +663,7 @@ DEFUN(subscriber_rat,
rat = OSMO_RAT_GERAN_A;
else if (strcmp(rat_str, "utran-iu") == 0)
rat = OSMO_RAT_UTRAN_IU;
- else if (strcmp(rat_str, "eutran") == 0)
+ else if (strcmp(rat_str, "eutran-sgs") == 0)
rat = OSMO_RAT_EUTRAN_SGS;
allowed = (strcmp(allowed_forbidden, "allowed") == 0);