diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-12-29 05:29:00 +0100 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2019-08-20 04:42:48 +0200 |
commit | 63450d990b6d17b6b2dd2e43c4a248e9008d436d (patch) | |
tree | e2645600d3320130e6cdfccf1330ef456cbdf955 | |
parent | d2d9f3583580012b10ac5951c096174c05106c50 (diff) |
add USSD handlers to enable/disable 2G access
Change-Id: Ib266bf6ebc7692362a443efbf9b4ae69aee671d6
-rw-r--r-- | doc/examples/osmo-hlr.cfg | 2 | ||||
-rw-r--r-- | src/hlr_ussd.c | 60 | ||||
-rw-r--r-- | src/hlr_vty.c | 2 |
3 files changed, 63 insertions, 1 deletions
diff --git a/doc/examples/osmo-hlr.cfg b/doc/examples/osmo-hlr.cfg index 58166f7..dc683d9 100644 --- a/doc/examples/osmo-hlr.cfg +++ b/doc/examples/osmo-hlr.cfg @@ -25,5 +25,7 @@ hlr ussd route prefix *#100# internal own-msisdn ussd route prefix *#101# internal own-imsi ussd route prefix *#102# internal get-ran + ussd route prefix *#200# internal gsm-off + ussd route prefix *#201# internal gsm-on ussd route prefix *#300# internal umts-off ussd route prefix *#301# internal umts-on diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c index c88c1cd..7ca882d 100644 --- a/src/hlr_ussd.c +++ b/src/hlr_ussd.c @@ -396,6 +396,58 @@ static int handle_ussd_get_ran(struct osmo_gsup_conn *conn, struct ss_session *s return rc; } +static int handle_ussd_gsm_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_GERAN_A, true); + rc = ss_tx_ussd_7bit(ss, true, req->invoke_id, + "Enabled GERAN-A (2G)"); + 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_gsm_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_GERAN_A, false); + rc = ss_tx_ussd_7bit(ss, true, req->invoke_id, + "Disabled GERAN-A (2G)"); + 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_on(struct osmo_gsup_conn *conn, struct ss_session *ss, const struct osmo_gsup_message *gsup, const struct ss_request *req) @@ -462,6 +514,14 @@ static const struct hlr_iuse hlr_iuses[] = { .handle_ussd = handle_ussd_get_ran, }, { + .name = "gsm-on", + .handle_ussd = handle_ussd_gsm_on, + }, + { + .name = "gsm-off", + .handle_ussd = handle_ussd_gsm_off, + }, + { .name = "umts-on", .handle_ussd = handle_ussd_umts_on, }, diff --git a/src/hlr_vty.c b/src/hlr_vty.c index 5e7fa9a..46bbb28 100644 --- a/src/hlr_vty.c +++ b/src/hlr_vty.c @@ -156,7 +156,7 @@ DEFUN(cfg_hlr_gsup_bind_ip, #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|umts-on|umts-off)" +#define INT_CHOICE "(own-msisdn|own-imsi|get-ran|gsm-on|gsm-off|umts-on|umts-off)" #define INT_STR "Internal USSD Handler\n" \ "Respond with subscribers' own MSISDN\n" \ "Respond with subscribers' own IMSI\n" \ |