Enabling/disabling 4G RAN for given subscriber
The change adds support for enabling and disabling connection through 4G RAN by a subscriber with use of USSD codes. Change-Id: Idf964d9c770a0a1cb5c486eb2a7592d6bf44171c
This commit is contained in:
parent
4dd28f4150
commit
6e24a483a9
|
@ -29,3 +29,5 @@ hlr
|
||||||
ussd route prefix *#201# internal gsm-on
|
ussd route prefix *#201# internal gsm-on
|
||||||
ussd route prefix *#300# internal umts-off
|
ussd route prefix *#300# internal umts-off
|
||||||
ussd route prefix *#301# internal umts-on
|
ussd route prefix *#301# internal umts-on
|
||||||
|
ussd route prefix *#400# internal lte-off
|
||||||
|
ussd route prefix *#401# internal lte-on
|
||||||
|
|
|
@ -97,7 +97,7 @@ CREATE TABLE ind (
|
||||||
-- If a subscriber has no entry, that means that all RATs are allowed (backwards compat).
|
-- If a subscriber has no entry, that means that all RATs are allowed (backwards compat).
|
||||||
CREATE TABLE subscriber_rat (
|
CREATE TABLE subscriber_rat (
|
||||||
subscriber_id INTEGER, -- subscriber.id
|
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
|
allowed BOOLEAN CHECK(allowed in (0, 1)) NOT NULL DEFAULT 0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -391,14 +391,17 @@ static int handle_ussd_get_ran(struct ss_session *ss,
|
||||||
rat = "2G";
|
rat = "2G";
|
||||||
else if (!strcmp(subscr.last_lu_rat_cs, "UTRAN-Iu"))
|
else if (!strcmp(subscr.last_lu_rat_cs, "UTRAN-Iu"))
|
||||||
rat = "3G";
|
rat = "3G";
|
||||||
|
else if (!strcmp(subscr.last_lu_rat_cs, "EUTRAN-SGs"))
|
||||||
|
rat = "4G";
|
||||||
else
|
else
|
||||||
rat = subscr.last_lu_rat_cs;
|
rat = subscr.last_lu_rat_cs;
|
||||||
|
|
||||||
snprintf(response, sizeof(response),
|
snprintf(response, sizeof(response),
|
||||||
"Now on %s. Available:%s%s.",
|
"Now on %s. Available:%s%s%s.",
|
||||||
rat,
|
rat,
|
||||||
subscr.rat_types[OSMO_RAT_GERAN_A]? " 2G" : "",
|
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);
|
rc = ss_tx_to_ms_ussd_7bit(ss, true, req->invoke_id, response);
|
||||||
break;
|
break;
|
||||||
|
@ -518,6 +521,59 @@ static int handle_ussd_umts_off(struct ss_session *ss,
|
||||||
return rc;
|
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[] = {
|
static const struct hlr_iuse hlr_iuses[] = {
|
||||||
{
|
{
|
||||||
.name = "own-msisdn",
|
.name = "own-msisdn",
|
||||||
|
@ -547,6 +603,14 @@ static const struct hlr_iuse hlr_iuses[] = {
|
||||||
.name = "umts-off",
|
.name = "umts-off",
|
||||||
.handle_ussd = handle_ussd_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)
|
const struct hlr_iuse *iuse_find(const char *name)
|
||||||
|
|
|
@ -174,13 +174,17 @@ DEFUN(cfg_hlr_gsup_ipa_name,
|
||||||
#define UROUTE_STR "Routing Configuration\n"
|
#define UROUTE_STR "Routing Configuration\n"
|
||||||
#define PREFIX_STR "Prefix-Matching Route\n" "USSD Prefix\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" \
|
#define INT_STR "Internal USSD Handler\n" \
|
||||||
"Respond with subscribers' own MSISDN\n" \
|
"Respond with subscribers' own MSISDN\n" \
|
||||||
"Respond with subscribers' own IMSI\n" \
|
"Respond with subscribers' own IMSI\n" \
|
||||||
"Respond with available RAN types\n" \
|
"Respond with available RAN types\n" \
|
||||||
|
"Enable GSM service\n" \
|
||||||
|
"Disable GSM service\n" \
|
||||||
"Enable UMTS 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" \
|
#define EXT_STR "External USSD Handler\n" \
|
||||||
"Name of External USSD Handler (IPA CCM ID)\n"
|
"Name of External USSD Handler (IPA CCM ID)\n"
|
||||||
|
|
|
@ -641,11 +641,12 @@ DEFUN(subscriber_nam,
|
||||||
|
|
||||||
DEFUN(subscriber_rat,
|
DEFUN(subscriber_rat,
|
||||||
subscriber_rat_cmd,
|
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
|
SUBSCR_UPDATE_HELP
|
||||||
"Allow or forbid specific Radio Access Types\n"
|
"Allow or forbid specific Radio Access Types\n"
|
||||||
"Set access to GERAN-A\n"
|
"Set access to GERAN-A\n"
|
||||||
"Set access to UTRAN-Iu\n"
|
"Set access to UTRAN-Iu\n"
|
||||||
|
"Set access to EUTRAN-SGs\n"
|
||||||
"Allow access\n"
|
"Allow access\n"
|
||||||
"Forbid access\n")
|
"Forbid access\n")
|
||||||
{
|
{
|
||||||
|
@ -662,7 +663,7 @@ DEFUN(subscriber_rat,
|
||||||
rat = OSMO_RAT_GERAN_A;
|
rat = OSMO_RAT_GERAN_A;
|
||||||
else if (strcmp(rat_str, "utran-iu") == 0)
|
else if (strcmp(rat_str, "utran-iu") == 0)
|
||||||
rat = OSMO_RAT_UTRAN_IU;
|
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;
|
rat = OSMO_RAT_EUTRAN_SGS;
|
||||||
|
|
||||||
allowed = (strcmp(allowed_forbidden, "allowed") == 0);
|
allowed = (strcmp(allowed_forbidden, "allowed") == 0);
|
||||||
|
|
Loading…
Reference in New Issue