aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-05-09 22:46:36 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-05-09 22:49:43 +0200
commitf26b42e129e0b2dbe58200fa5561ddff1fd29e31 (patch)
treed9b4be6b8f5d90bea7780e75a16b9608342866ba
parent301126d5b5a9eff4de490d23c1af45dabe365aea (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.h6
-rw-r--r--openbsc/src/libmsc/ctrl_commands.c6
-rw-r--r--openbsc/src/libmsc/db.c15
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c8
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)