diff options
Diffstat (limited to 'src/hlr_ussd.c')
-rw-r--r-- | src/hlr_ussd.c | 68 |
1 files changed, 66 insertions, 2 deletions
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) |