From 85439534961c34f620117979d658bdbb760bafb3 Mon Sep 17 00:00:00 2001 From: Ivan Kluchnikov Date: Tue, 21 Jul 2015 11:40:08 +0300 Subject: [PATCH] sub: Add the ability to set prefix for randomly generated extensions Prefix is added before randomly generated extension. Prefix is useful in case of "accept-all" authentication mode is used and routing based on number prefix is used. Added optional configuration parameter "extension-prefix". --- openbsc/include/openbsc/db.h | 4 ++-- openbsc/include/openbsc/gsm_data.h | 1 + openbsc/src/libbsc/bsc_vty.c | 14 ++++++++++++++ openbsc/src/libbsc/net_init.c | 1 + openbsc/src/libmsc/db.c | 16 +++++++++------- openbsc/src/libmsc/gsm_subscriber.c | 4 +++- openbsc/tests/db/db_test.c | 6 +++--- 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h index 6699a8600..acaf62a99 100644 --- a/openbsc/include/openbsc/db.h +++ b/openbsc/include/openbsc/db.h @@ -35,13 +35,13 @@ int db_prepare(void); int db_fini(void); /* subscriber management */ -struct gsm_subscriber *db_create_subscriber(const char *imsi); +struct gsm_subscriber *db_create_subscriber(const char *imsi, uint64_t prefix); struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, const char *subscr); int db_sync_subscriber(struct gsm_subscriber *subscriber); int db_subscriber_expire(void *priv, void (*callback)(void *priv, long long unsigned int id)); int db_subscriber_alloc_tmsi(struct gsm_subscriber *subscriber); -int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber); +int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber, uint64_t prefix); int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, uint32_t* token); int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char *imei); int db_subscriber_delete(struct gsm_subscriber *subscriber); diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 6f7c8dd2a..b67b8c6b9 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -280,6 +280,7 @@ struct gsm_network { int create_subscriber; struct gsm_subscriber_group *subscr_group; struct gsm_sms_queue *sms_queue; + uint64_t exten_prefix; /* control interface */ struct ctrl_handle *ctrl; diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index a4c5309d9..6be67882f 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -794,6 +794,8 @@ static int config_write_net(struct vty *vty) vty_out(vty, " dtx-used %u%s", gsmnet->dtx_enabled, VTY_NEWLINE); vty_out(vty, " subscriber-keep-in-ram %d%s", gsmnet->subscr_group->keep_subscr, VTY_NEWLINE); + vty_out(vty, " extension-prefix %llu%s", + gsmnet->exten_prefix, VTY_NEWLINE); return CMD_SUCCESS; } @@ -1601,6 +1603,17 @@ DEFUN(cfg_net_subscr_keep, return CMD_SUCCESS; } +DEFUN(cfg_net_exten_prefix, + cfg_net_exten_prefix_cmd, + "extension-prefix <1-999999999>", + "Prefix for subscribers extension.\n" + "Extension prefix\n") +{ + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + gsmnet->exten_prefix = strtoull(argv[0], NULL, 10); + return CMD_SUCCESS; +} + /* per-BTS configuration */ DEFUN(cfg_bts, cfg_bts_cmd, @@ -3805,6 +3818,7 @@ int bsc_vty_init(const struct log_info *cat) install_element(GSMNET_NODE, &cfg_net_dtx_cmd); install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd); install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd); + install_element(GSMNET_NODE, &cfg_net_exten_prefix_cmd); install_element(GSMNET_NODE, &cfg_bts_cmd); install_node(&bts_node, config_write_bts); diff --git a/openbsc/src/libbsc/net_init.c b/openbsc/src/libbsc/net_init.c index 568a0b85e..16e8146a7 100644 --- a/openbsc/src/libbsc/net_init.c +++ b/openbsc/src/libbsc/net_init.c @@ -49,6 +49,7 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod net->subscr_group->net = net; net->create_subscriber = 1; + net->exten_prefix = 0; net->country_code = country_code; net->network_code = network_code; diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 428f99bbc..38c72a4af 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -498,7 +498,7 @@ int db_fini(void) return 0; } -struct gsm_subscriber *db_create_subscriber(const char *imsi) +struct gsm_subscriber *db_create_subscriber(const char *imsi, uint64_t prefix) { dbi_result result; struct gsm_subscriber *subscr; @@ -533,7 +533,7 @@ struct gsm_subscriber *db_create_subscriber(const char *imsi) strncpy(subscr->imsi, imsi, GSM_IMSI_LENGTH-1); dbi_result_free(result); LOGP(DDB, LOGL_INFO, "New Subscriber: ID %llu, IMSI %s\n", subscr->id, subscr->imsi); - db_subscriber_alloc_exten(subscr); + db_subscriber_alloc_exten(subscr, prefix); return subscr; } @@ -1227,16 +1227,17 @@ int db_subscriber_alloc_tmsi(struct gsm_subscriber *subscriber) return 0; } -int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber) +int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber, uint64_t prefix) { dbi_result result = NULL; - uint32_t try; + uint64_t try; for (;;) { try = (rand()%(GSM_MAX_EXTEN-GSM_MIN_EXTEN+1)+GSM_MIN_EXTEN); + try = prefix*100000 + try; result = dbi_conn_queryf(conn, "SELECT * FROM Subscriber " - "WHERE extension = %i", + "WHERE extension = %llu", try ); if (!result) { @@ -1254,8 +1255,9 @@ int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber) } dbi_result_free(result); } - sprintf(subscriber->extension, "%i", try); - DEBUGP(DDB, "Allocated extension %i for IMSI %s.\n", try, subscriber->imsi); + sprintf(subscriber->extension, "%llu", try); + DEBUGP(DDB, "Allocated extension %llu for IMSI %s.\n", try, subscriber->imsi); + return db_sync_subscriber(subscriber); } /* diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c index 4559de581..2bf1c27d2 100644 --- a/openbsc/src/libmsc/gsm_subscriber.c +++ b/openbsc/src/libmsc/gsm_subscriber.c @@ -205,7 +205,9 @@ void subscr_remove_request(struct subscr_request *request) struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp, const char *imsi) { - struct gsm_subscriber *subscr = db_create_subscriber(imsi); + uint64_t prefix; + prefix = sgrp->net->exten_prefix; + struct gsm_subscriber *subscr = db_create_subscriber(imsi, prefix); if (subscr) subscr->group = sgrp; return subscr; diff --git a/openbsc/tests/db/db_test.c b/openbsc/tests/db/db_test.c index a02d1f801..f990d8f60 100644 --- a/openbsc/tests/db/db_test.c +++ b/openbsc/tests/db/db_test.c @@ -186,7 +186,7 @@ int main() struct gsm_subscriber *alice_db; char *alice_imsi = "3243245432345"; - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, 0); db_sync_subscriber(alice); alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice->imsi); COMPARE(alice, alice_db); @@ -194,7 +194,7 @@ int main() SUBSCR_PUT(alice); alice_imsi = "3693245423445"; - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, 0); db_subscriber_assoc_imei(alice, "1234567890"); db_subscriber_alloc_tmsi(alice); alice->lac=42; @@ -220,7 +220,7 @@ int main() SUBSCR_PUT(alice); alice_imsi = "9993245423445"; - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, 0); db_subscriber_alloc_tmsi(alice); alice->lac=42; db_sync_subscriber(alice);