diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2016-05-09 22:46:36 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2016-05-09 22:49:43 +0200 |
commit | f26b42e129e0b2dbe58200fa5561ddff1fd29e31 (patch) | |
tree | d9b4be6b8f5d90bea7780e75a16b9608342866ba | |
parent | 301126d5b5a9eff4de490d23c1af45dabe365aea (diff) |
nitb: Limit service to SMS only
* Pick a worse "extension space" for the auto extensions
* Add some form of "limiting" the service..
-rw-r--r-- | openbsc/include/openbsc/gsm_subscriber.h | 6 | ||||
-rw-r--r-- | openbsc/src/libmsc/ctrl_commands.c | 6 | ||||
-rw-r--r-- | openbsc/src/libmsc/db.c | 15 | ||||
-rw-r--r-- | openbsc/src/libmsc/gsm_04_08.c | 8 |
4 files changed, 26 insertions, 9 deletions
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h index 7d6c776bc..2c55e8219 100644 --- a/openbsc/include/openbsc/gsm_subscriber.h +++ b/openbsc/include/openbsc/gsm_subscriber.h @@ -9,8 +9,8 @@ #define GSM_NAME_LENGTH 160 #define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */ -#define GSM_MIN_EXTEN 20000 -#define GSM_MAX_EXTEN 49999 +#define GSM_MIN_EXTEN 40000000000 +#define GSM_MAX_EXTEN 49999999999 #define GSM_SUBSCRIBER_FIRST_CONTACT 0x00000001 /* gprs_sgsn.h defines additional flags including and above bit 16 (0x10000) */ @@ -71,6 +71,8 @@ struct gsm_subscriber { int is_paging; struct llist_head requests; + int limited_service; + /* GPRS/SGSN related fields */ struct sgsn_subscriber_data *sgsn_data; }; diff --git a/openbsc/src/libmsc/ctrl_commands.c b/openbsc/src/libmsc/ctrl_commands.c index c81cd448e..4f5480819 100644 --- a/openbsc/src/libmsc/ctrl_commands.c +++ b/openbsc/src/libmsc/ctrl_commands.c @@ -101,6 +101,7 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) goto fail; subscr->authorized = 1; + subscr->limited_service = 0; strncpy(subscr->extension, msisdn, GSM_EXTENSION_LENGTH - 1); subscr->extension[GSM_EXTENSION_LENGTH-1] = '\0'; @@ -218,11 +219,12 @@ static int set_subscriber_list(struct ctrl_cmd *cmd, void *d) static void list_cb(struct gsm_subscriber *subscr, void *d) { char **data = (char **) d; - *data = talloc_asprintf_append(*data, "%s,%s,%d,%s\n", + *data = talloc_asprintf_append(*data, "%s,%s,%d,%s,%d\n", subscr->imsi, subscr->extension, subscr->authorized, osmo_hexdump_nospc((const uint8_t *) subscr->name, - strlen(subscr->name))); + strlen(subscr->name)), + subscr->limited_service); } static int get_subscriber_list(struct ctrl_cmd *cmd, void *d) diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index cbe0aa71e..7bbd793cf 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -47,7 +47,7 @@ static char *db_basename = NULL; static char *db_dirname = NULL; static dbi_conn conn; -#define SCHEMA_REVISION "4" +#define SCHEMA_REVISION "9800" enum { SCHEMA_META, @@ -85,7 +85,8 @@ static const char *create_stmts[] = { "authorized INTEGER NOT NULL DEFAULT 0, " "tmsi TEXT UNIQUE, " "lac INTEGER NOT NULL DEFAULT 0, " - "expire_lu TIMESTAMP DEFAULT NULL" + "expire_lu TIMESTAMP DEFAULT NULL, " + "limited_service INTEGER NOT NULL DEFAULT 0" ")", [SCHEMA_AUTH] = "CREATE TABLE IF NOT EXISTS AuthToken (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " @@ -825,7 +826,7 @@ static void db_set_from_query(struct gsm_subscriber *subscr, dbi_conn result) subscr->expire_lu = GSM_SUBSCRIBER_NO_EXPIRATION; subscr->authorized = dbi_result_get_ulonglong(result, "authorized"); - + subscr->limited_service = dbi_result_get_ulonglong(result, "limited_service"); } #define BASE_QUERY "SELECT * FROM Subscriber " @@ -890,9 +891,9 @@ struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, subscr->id = dbi_result_get_ulonglong(result, "id"); db_set_from_query(subscr, result); - DEBUGP(DDB, "Found Subscriber: ID %llu, IMSI %s, NAME '%s', TMSI %u, EXTEN '%s', LAC %hu, AUTH %u\n", + DEBUGP(DDB, "Found Subscriber: ID %llu, IMSI %s, NAME '%s', TMSI %u, EXTEN '%s', LAC %hu, AUTH %u LTD %u\n", subscr->id, subscr->imsi, subscr->name, subscr->tmsi, subscr->extension, - subscr->lac, subscr->authorized); + subscr->lac, subscr->authorized, subscr->limited_service); dbi_result_free(result); get_equipment_by_subscr(subscr); @@ -955,6 +956,7 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) "name = %s, " "extension = %s, " "authorized = %i, " + "limited_service = %i, " "tmsi = %s, " "lac = %i, " "expire_lu = NULL " @@ -962,6 +964,7 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) q_name, q_extension, subscriber->authorized, + subscriber->limited_service, q_tmsi, subscriber->lac, subscriber->imsi); @@ -972,6 +975,7 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) "name = %s, " "extension = %s, " "authorized = %i, " + "limited_service = %i, " "tmsi = %s, " "lac = %i, " "expire_lu = datetime(%i, 'unixepoch') " @@ -979,6 +983,7 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) q_name, q_extension, subscriber->authorized, + subscriber->limited_service, q_tmsi, subscriber->lac, (int) subscriber->expire_lu, diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c index 1524ec44f..6490b8bbf 100644 --- a/openbsc/src/libmsc/gsm_04_08.c +++ b/openbsc/src/libmsc/gsm_04_08.c @@ -999,6 +999,14 @@ static int gsm48_rx_mm_serv_req(struct gsm_subscriber_connection *conn, struct m return gsm48_tx_mm_serv_rej(conn, GSM48_REJECT_IMSI_UNKNOWN_IN_VLR); + if (subscr->limited_service && req->cm_service_type != 0x04) { + LOGP(DMM, LOGL_DEBUG, + "Rejecting CM service req of subscr(IMSI=%s)\n", + subscr->imsi); + subscr_put(subscr); + return gsm48_tx_mm_serv_rej(conn, GSM48_REJECT_SERVICES_NOT_ALLOWED); + } + if (!conn->subscr) conn->subscr = subscr; else if (conn->subscr == subscr) |