lists.osmocom.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
List overview
Download
OpenBSC
May 2016
----- 2025 -----
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
openbsc@lists.osmocom.org
25 participants
164 discussions
Start a n
N
ew thread
[PATCH] Make random MSISDN assignment optional
by msuraev@sysmocom.de
From: Max <msuraev(a)sysmocom.de> Previously if subscriber was automatically created it got assigned random MSISDN number between 20000 and 49999. Make it optional (defaulting to previous behavior) by adding following: * optional "no-extension" argument to subscriber-create-on-demand * db unit tests * vty test The range for random extension can now be specified with "subscriber-create-on-demand random" command. Note: using the db made with new code might result in subscribers with empty extension. Such subscribers cannot be deleted using old code. Make sure not to mix db versions or manually fix it by editing sqlite with external program. Fixes: OS#1658 --- openbsc/include/openbsc/db.h | 8 ++- openbsc/include/openbsc/gsm_data.h | 8 +++ openbsc/include/openbsc/gsm_subscriber.h | 5 +- openbsc/src/libbsc/net_init.c | 5 +- openbsc/src/libcommon/gsm_subscriber_base.c | 1 + openbsc/src/libmsc/ctrl_commands.c | 9 ++- openbsc/src/libmsc/db.c | 37 +++++++---- openbsc/src/libmsc/gsm_04_08.c | 12 +++- openbsc/src/libmsc/gsm_subscriber.c | 6 +- openbsc/src/libmsc/vty_interface_layer3.c | 51 +++++++++++++-- openbsc/tests/db/db_test.c | 99 +++++++++++++---------------- openbsc/tests/vty_test_runner.py | 14 ++++ 12 files changed, 169 insertions(+), 86 deletions(-) diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h index 6699a86..4da9634 100644 --- a/openbsc/include/openbsc/db.h +++ b/openbsc/include/openbsc/db.h @@ -20,6 +20,8 @@ #ifndef _DB_H #define _DB_H +#include <stdbool.h> + #include "gsm_subscriber.h" struct gsm_equipment; @@ -35,13 +37,15 @@ 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 smin, + uint64_t smax, bool ext); 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 smin, + uint64_t smax); 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 6d7aba3..14b002a 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -18,6 +18,12 @@ struct gsm_subscriber_group; #define OBSC_LINKID_CB(__msgb) (__msgb)->cb[3] +enum gsm_subscr_ext { + GSM_SUBSCR_DONT_CREATE = 0, + GSM_SUBSCR_RANDOM_EXT = 1, + GSM_SUBSCR_NO_EXT = 2 +}; + enum gsm_security_event { GSM_SECURITY_NOAVAIL, GSM_SECURITY_AUTH_FAILED, @@ -283,6 +289,8 @@ struct gsm_network { /* subscriber related features */ int create_subscriber; + uint64_t ext_min; + uint64_t ext_max; struct gsm_subscriber_group *subscr_group; struct gsm_sms_queue *sms_queue; diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h index 7d6c776..5030d65 100644 --- a/openbsc/include/openbsc/gsm_subscriber.h +++ b/openbsc/include/openbsc/gsm_subscriber.h @@ -1,6 +1,8 @@ #ifndef _GSM_SUBSCR_H #define _GSM_SUBSCR_H +#include <stdbool.h> + #include "gsm_data.h" #include <osmocom/core/linuxlist.h> @@ -91,7 +93,8 @@ enum gsm_subscriber_update_reason { struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp, - const char *imsi); + const char *imsi, uint64_t smin, + uint64_t smax, bool ext); struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_subscriber_group *sgrp, uint32_t tmsi); struct gsm_subscriber *subscr_get_by_imsi(struct gsm_subscriber_group *sgrp, diff --git a/openbsc/src/libbsc/net_init.c b/openbsc/src/libbsc/net_init.c index 568a0b8..a524ead 100644 --- a/openbsc/src/libbsc/net_init.c +++ b/openbsc/src/libbsc/net_init.c @@ -48,7 +48,7 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod INIT_LLIST_HEAD(&net->bsc_data->mscs); net->subscr_group->net = net; - net->create_subscriber = 1; + net->create_subscriber = GSM_SUBSCR_RANDOM_EXT; net->country_code = country_code; net->network_code = network_code; @@ -104,7 +104,8 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod net->stats.bts.rsl_fail = osmo_counter_alloc("net.bts.rsl_fail"); net->mncc_recv = mncc_recv; - + net->ext_min = GSM_MIN_EXTEN; + net->ext_max = GSM_MAX_EXTEN; gsm_net_update_ctype(net); return net; diff --git a/openbsc/src/libcommon/gsm_subscriber_base.c b/openbsc/src/libcommon/gsm_subscriber_base.c index a455824..5f0a1be 100644 --- a/openbsc/src/libcommon/gsm_subscriber_base.c +++ b/openbsc/src/libcommon/gsm_subscriber_base.c @@ -60,6 +60,7 @@ struct gsm_subscriber *subscr_alloc(void) llist_add_tail(&s->entry, &active_subscribers); s->use_count = 1; s->tmsi = GSM_RESERVED_TMSI; + s->extension[0] = '\0'; INIT_LLIST_HEAD(&s->requests); diff --git a/openbsc/src/libmsc/ctrl_commands.c b/openbsc/src/libmsc/ctrl_commands.c index 9ac39de..44b1ebd 100644 --- a/openbsc/src/libmsc/ctrl_commands.c +++ b/openbsc/src/libmsc/ctrl_commands.c @@ -18,6 +18,9 @@ * along with this program. If not, see <
http://www.gnu.org/licenses/
>. * */ + +#include <stdbool.h> + #include <osmocom/ctrl/control_cmd.h> #include <openbsc/gsm_data.h> #include <openbsc/gsm_subscriber.h> @@ -83,6 +86,8 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) char *tmp, *imsi, *msisdn, *alg, *ki, *saveptr = NULL; struct gsm_subscriber* subscr; int rc; + bool ext = (GSM_SUBSCR_RANDOM_EXT == net->create_subscriber) ? true : + false; tmp = talloc_strdup(cmd, cmd->value); if (!tmp) @@ -95,7 +100,9 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) subscr = subscr_get_by_imsi(net->subscr_group, imsi); if (!subscr) - subscr = subscr_create_subscriber(net->subscr_group, imsi); + subscr = subscr_create_subscriber(net->subscr_group, imsi, + net->ext_min, + net->ext_max, ext); if (!subscr) goto fail; diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 267b5ef..1e112cb 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -23,6 +23,7 @@ #include <inttypes.h> #include <libgen.h> #include <stdio.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <errno.h> @@ -500,7 +501,8 @@ 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 smin, + uint64_t smax, bool ext) { dbi_result result; struct gsm_subscriber *subscr; @@ -532,7 +534,8 @@ 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); + if (ext) + db_subscriber_alloc_exten(subscr, smin, smax); return subscr; } @@ -937,8 +940,11 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) dbi_conn_quote_string_copy(conn, subscriber->name, &q_name); - dbi_conn_quote_string_copy(conn, - subscriber->extension, &q_extension); + if (subscriber->extension[0] != '\0') + dbi_conn_quote_string_copy(conn, + subscriber->extension, &q_extension); + else + q_extension = strdup("NULL"); if (subscriber->tmsi != GSM_RESERVED_TMSI) { sprintf(tmsi, "%u", subscriber->tmsi); @@ -1043,15 +1049,17 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result); - result = dbi_conn_queryf(conn, - "DELETE FROM SMS WHERE src_addr=%s OR dest_addr=%s", - subscr->extension, subscr->extension); - if (!result) { - LOGP(DDB, LOGL_ERROR, - "Failed to delete SMS for %llu\n", subscr->id); - return -1; + if (subscr->extension[0] != '\0') { + result = dbi_conn_queryf(conn, + "DELETE FROM SMS WHERE src_addr=%s OR dest_addr=%s", + subscr->extension, subscr->extension); + if (!result) { + LOGP(DDB, LOGL_ERROR, + "Failed to delete SMS for %llu\n", subscr->id); + return -1; + } + dbi_result_free(result); } - dbi_result_free(result); result = dbi_conn_queryf(conn, "DELETE FROM VLR WHERE subscriber_id=%llu", @@ -1231,13 +1239,14 @@ 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 smin, + uint64_t smax) { dbi_result result = NULL; uint32_t try; for (;;) { - try = (rand()%(GSM_MAX_EXTEN-GSM_MIN_EXTEN+1)+GSM_MIN_EXTEN); + try = (rand() % (smax - smin + 1) + smin); result = dbi_conn_queryf(conn, "SELECT * FROM Subscriber " "WHERE extension = %i", diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c index 05cb886..d22db73 100644 --- a/openbsc/src/libmsc/gsm_04_08.c +++ b/openbsc/src/libmsc/gsm_04_08.c @@ -25,6 +25,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdbool.h> #include <errno.h> #include <time.h> #include <netinet/in.h> @@ -517,6 +518,8 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms struct gsm_network *net = bts->network; uint8_t mi_type = gh->data[1] & GSM_MI_TYPE_MASK; char mi_string[GSM48_MI_SIZE]; + bool ext = (GSM_SUBSCR_RANDOM_EXT == net->create_subscriber) ? true : + false; gsm48_mi_to_string(mi_string, sizeof(mi_string), &gh->data[1], gh->data[0]); DEBUGP(DMM, "IDENTITY RESPONSE: MI(%s)=%s\n", @@ -532,7 +535,8 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms mi_string); if (!conn->subscr && net->create_subscriber) conn->subscr = subscr_create_subscriber( - net->subscr_group, mi_string); + net->subscr_group, mi_string, + net->ext_min, net->ext_max, ext); } if (!conn->subscr && conn->loc_operation) { gsm0408_loc_upd_rej(conn, bts->network->reject_cause); @@ -593,6 +597,8 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb struct gsm_bts *bts = conn->bts; uint8_t mi_type; char mi_string[GSM48_MI_SIZE]; + bool ext = (GSM_SUBSCR_RANDOM_EXT == bts->network->create_subscriber) ? + true : false; lu = (struct gsm48_loc_upd_req *) gh->data; @@ -643,7 +649,9 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb subscr = subscr_get_by_imsi(bts->network->subscr_group, mi_string); if (!subscr && bts->network->create_subscriber) { subscr = subscr_create_subscriber( - bts->network->subscr_group, mi_string); + bts->network->subscr_group, mi_string, + bts->network->ext_min, bts->network->ext_max, + ext); } if (!subscr) { gsm0408_loc_upd_rej(conn, bts->network->reject_cause); diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c index 57c10cf..7d62888 100644 --- a/openbsc/src/libmsc/gsm_subscriber.c +++ b/openbsc/src/libmsc/gsm_subscriber.c @@ -203,9 +203,11 @@ void subscr_remove_request(struct subscr_request *request) } struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp, - const char *imsi) + const char *imsi, uint64_t smin, + uint64_t smax, bool ext) { - struct gsm_subscriber *subscr = db_create_subscriber(imsi); + struct gsm_subscriber *subscr = + db_create_subscriber(imsi, smin, smax, ext); if (subscr) subscr->group = sgrp; return subscr; diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c index 790fedf..51b7258 100644 --- a/openbsc/src/libmsc/vty_interface_layer3.c +++ b/openbsc/src/libmsc/vty_interface_layer3.c @@ -21,6 +21,8 @@ #include <stdlib.h> #include <limits.h> #include <unistd.h> +#include <stdbool.h> +#include <inttypes.h> #include <time.h> #include <osmocom/vty/command.h> @@ -235,12 +237,16 @@ DEFUN(subscriber_create, { struct gsm_network *gsmnet = gsmnet_from_vty(vty); struct gsm_subscriber *subscr; + bool ext = (GSM_SUBSCR_RANDOM_EXT == gsmnet->create_subscriber) ? true : + false; subscr = subscr_get_by_imsi(gsmnet->subscr_group, argv[0]); if (subscr) db_sync_subscriber(subscr); else { - subscr = subscr_create_subscriber(gsmnet->subscr_group, argv[0]); + subscr = subscr_create_subscriber(gsmnet->subscr_group, argv[0], + gsmnet->ext_min, + gsmnet->ext_max, ext); if (!subscr) { vty_out(vty, "%% No subscriber created for IMSI %s%s", @@ -1032,11 +1038,33 @@ DEFUN(cfg_nitb, cfg_nitb_cmd, } DEFUN(cfg_nitb_subscr_create, cfg_nitb_subscr_create_cmd, - "subscriber-create-on-demand", - "Make a new record when a subscriber is first seen.\n") + "subscriber-create-on-demand [no-extension]", + "Make a new record when a subscriber is first seen.\n" + "Do not assign random extension when creating subscriber\n") { struct gsm_network *gsmnet = gsmnet_from_vty(vty); - gsmnet->create_subscriber = 1; + if (argc) + gsmnet->create_subscriber = GSM_SUBSCR_NO_EXT; + else + gsmnet->create_subscriber = GSM_SUBSCR_RANDOM_EXT; + return CMD_SUCCESS; +} + +DEFUN(cfg_nitb_subscr_random, cfg_nitb_subscr_random_cmd, + "subscriber-create-on-demand random <1-99999> <2-99999>", + "Set random parameters for a new record when a subscriber is first seen.\n" + "Set random parameters for a new record when a subscriber is first seen.\n" + "Minimum for subscriber extension\n""Maximum for subscriber extension\n") +{ + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + uint64_t mi = atoi(argv[0]), ma = atoi(argv[1]); + if (mi >= ma) { + vty_out(vty, "Incorrect range: %s >= %s, expected MIN < MAX%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + gsmnet->ext_min = mi; + gsmnet->ext_max = ma; return CMD_SUCCESS; } @@ -1045,7 +1073,7 @@ DEFUN(cfg_nitb_no_subscr_create, cfg_nitb_no_subscr_create_cmd, NO_STR "Make a new record when a subscriber is first seen.\n") { struct gsm_network *gsmnet = gsmnet_from_vty(vty); - gsmnet->create_subscriber = 0; + gsmnet->create_subscriber = GSM_SUBSCR_DONT_CREATE; return CMD_SUCCESS; } @@ -1070,9 +1098,17 @@ DEFUN(cfg_nitb_no_assign_tmsi, cfg_nitb_no_assign_tmsi_cmd, static int config_write_nitb(struct vty *vty) { struct gsm_network *gsmnet = gsmnet_from_vty(vty); + const char *pref = gsmnet->create_subscriber ? "" : "no ", *post = + (GSM_SUBSCR_NO_EXT == gsmnet->create_subscriber) ? + " no-extension" : ""; + vty_out(vty, "nitb%s", VTY_NEWLINE); - vty_out(vty, " %ssubscriber-create-on-demand%s", - gsmnet->create_subscriber ? "" : "no ", VTY_NEWLINE); + vty_out(vty, " %ssubscriber-create-on-demand%s%s", pref, post, + VTY_NEWLINE); + if (gsmnet->ext_min != GSM_MIN_EXTEN || gsmnet->ext_max != GSM_MAX_EXTEN) + vty_out(vty, "subscriber-create-on-demand random %"PRIu64" %" + PRIu64"%s", gsmnet->ext_min, gsmnet->ext_max, + VTY_NEWLINE); vty_out(vty, " %sassign-tmsi%s", gsmnet->avoid_tmsi ? "no " : "", VTY_NEWLINE); return CMD_SUCCESS; @@ -1127,6 +1163,7 @@ int bsc_vty_init_extra(void) install_element(CONFIG_NODE, &cfg_nitb_cmd); install_node(&nitb_node, config_write_nitb); install_element(NITB_NODE, &cfg_nitb_subscr_create_cmd); + install_element(NITB_NODE, &cfg_nitb_subscr_random_cmd); install_element(NITB_NODE, &cfg_nitb_no_subscr_create_cmd); install_element(NITB_NODE, &cfg_nitb_assign_tmsi_cmd); install_element(NITB_NODE, &cfg_nitb_no_assign_tmsi_cmd); diff --git a/openbsc/tests/db/db_test.c b/openbsc/tests/db/db_test.c index fb159a5..a689789 100644 --- a/openbsc/tests/db/db_test.c +++ b/openbsc/tests/db/db_test.c @@ -28,6 +28,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdbool.h> #include <inttypes.h> static struct gsm_network dummy_net; @@ -159,10 +160,44 @@ static void test_sms_migrate(void) subscr_put(rcv_subscr); } -int main() +static void test_subs(const char *alice_imsi, char *imei1, char *imei2, bool ext) { + struct gsm_subscriber *alice = NULL, *alice_db; char scratch_str[256]; + alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, + ext); + db_subscriber_assoc_imei(alice, imei1); + if (imei2) + db_subscriber_assoc_imei(alice, imei2); + db_subscriber_alloc_tmsi(alice); + alice->lac=42; + db_sync_subscriber(alice); + /* Get by TMSI */ + snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); + alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + /* Get by IMSI */ + alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi); + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + /* Get by id */ + snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); + alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + /* Get by extension */ + alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); + if (alice_db) { + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + } + SUBSCR_PUT(alice); +} + +int main() +{ printf("Testing subscriber database code.\n"); osmo_init_logging(&log_info); log_set_print_filename(osmo_stderr_target, 0); @@ -186,68 +221,22 @@ int main() struct gsm_subscriber *alice_db; char *alice_imsi = "3243245432345"; - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, + true); db_sync_subscriber(alice); alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice->imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); SUBSCR_PUT(alice); - alice_imsi = "3693245423445"; - alice = db_create_subscriber(alice_imsi); - db_subscriber_assoc_imei(alice, "1234567890"); - db_subscriber_alloc_tmsi(alice); - alice->lac=42; - db_sync_subscriber(alice); - /* Get by TMSI */ - snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by IMSI */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by id */ - snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by extension */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - SUBSCR_PUT(alice); - - alice_imsi = "9993245423445"; - alice = db_create_subscriber(alice_imsi); - db_subscriber_alloc_tmsi(alice); - alice->lac=42; - db_sync_subscriber(alice); - db_subscriber_assoc_imei(alice, "1234567890"); - db_subscriber_assoc_imei(alice, "6543560920"); - /* Get by TMSI */ - snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by IMSI */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by id */ - snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by extension */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - SUBSCR_PUT(alice); + test_subs("3693245423445", "1234567890", NULL, true); + test_subs("9993245423445", "1234567890", "6543560920", true); + test_subs("3123122223445", "1234567890", NULL, false); + test_subs("9123121223445", "1234567890", "6543560920", false); /* create it again and see it fails */ - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, + true); OSMO_ASSERT(!alice); test_sms(); diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index c088855..6c49a03 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -408,11 +408,13 @@ class TestVTYNITB(TestVTYGenericBSC): self.vty.enable() imsi = "204300854013739" + imsi2 = "204300854013769" wrong_imsi = "204300999999999" # Lets create one res = self.vty.command('subscriber create imsi '+imsi) self.assert_(res.find(" IMSI: "+imsi) > 0) + self.assert_(res.find("Extension") > 0) self.vty.verify('subscriber imsi '+wrong_imsi+' name wrong', ['% No subscriber found for imsi '+wrong_imsi]) res = self.vty.command('subscriber imsi '+imsi+' name '+('X' * 160)) @@ -426,9 +428,21 @@ class TestVTYNITB(TestVTYGenericBSC): self.vty.verify('subscriber imsi '+imsi+' extension '+('1' * 14), ['']) + # Another one - without extension + self.vty.command("configure terminal") + self.vty.command("nitb") + self.vty.command("subscriber-create-on-demand no-extension") + self.vty.command("end") + + res = self.vty.command('subscriber create imsi ' + imsi2) + self.assert_(res.find(" IMSI: " + imsi2) > 0) + self.assertEquals(res.find("Extension"), -1) + # Delete it res = self.vty.command('subscriber delete imsi '+imsi) self.assert_(res != "") + res = self.vty.command('subscriber delete imsi ' + imsi2) + self.assert_(res != "") def testShowPagingGroup(self): res = self.vty.command("show paging-group 255 1234567") -- 2.8.1
9 years, 1 month
2
1
0
0
test-ranap failures
by Neels Hofmeyr
Hi Harald & others, just dropping a note on a recent test failure with some confusion included concerning the osmo-iuh test-ranap.c test suite... I fixed it in master's HEAD 95d0ba5, this mail is just in case anyone else hits this confusion. from Harald's recent commits on osmo-iuh, I see two test failures. The first that came to my attention is a missing free: [[[ --- expout 2016-05-02 14:23:55.303083568 +0200 +++ /n/s/osmo/git/osmo-iuh/src/tests/testsuite.dir/at-groups/3/stdout 2016-05-02 14:23:55.311083487 +0200 @@ -213,6 +213,7 @@ </RANAP_IE> 00 0a 00 11 00 00 01 00 29 40 0a 00 00 01 00 28 40 03 05 c2 d0 report -talloc report on 'asn1_context' (total 0 bytes in 1 blocks) +talloc report on 'asn1_context' (total 40 bytes in 2 blocks) + constr_CHOICE.c:927 contains 40 bytes in 1 blocks (ref 0) 0x1c81690 talloc report on 'msgb' (total 1 bytes in 1 blocks) exit 3. testsuite.at:18: 3. ranap (testsuite.at:18): FAILED (testsuite.at:21) ]]] I found that it is introduced by 14da5411a4fbe05eccff5b4f0934d52773a3f97a ("test-ranap: Add test case about constrained integer range decode") -- merely a missing free of the decoded RANAP_Cause_t*. However, when warping back to that commit I also see an unexpected reversal of the byte order of two bytes in six places, introduced in f764a15c2339d5b24f ("Add test case about RANAP MaxBitrate encoding") and later secretly fixed in bb289e3b810683d ("RAB parameters: add Extended Max Bitrate") which is actually my commit but now appears in master as authored by you. The failure looks like this: [[[ ./testsuite.at:21: $abs_top_builddir/src/tests/test-ranap --- expout 2016-05-02 14:24:18.018852893 +0200 +++ /n/s/osmo/git/osmo-iuh/src/tests/testsuite.dir/at-groups/3/stdout 2016-05-02 14:24:18.046852609 +0200 @@ -88,7 +88,7 @@ <firstValue> 38 02 D8 01 2F A7 20 2F A8 00 00 F4 4C 08 0A 02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22 28 - 14 00 3C 40 00 00 00 50 3D 02 02 00 0D C0 35 00 + 14 00 3C 40 00 00 00 50 3D 02 00 02 0D C0 35 00 01 0A 0B 0C 0D 40 00 00 00 01 </firstValue> <secondCriticality><ignore/></secondCriticality> @@ -101,11 +101,11 @@ 00 00 01 00 35 00 3A 38 02 D8 01 2F A7 20 2F A8 00 00 F4 4C 08 0A 02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22 28 14 00 3C 40 00 00 00 50 3D - 02 02 00 0D C0 35 00 01 0A 0B 0C 0D 40 00 00 00 + 02 00 02 0D C0 35 00 01 0A 0B 0C 0D 40 00 00 00 01 40 01 00 </value> </RANAP_IE> -00 00 00 4b 00 00 01 00 36 40 44 00 00 01 00 35 00 3a 38 02 d8 01 2f a7 20 2f a8 00 00 f4 4c 08 0a 02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22 28 14 00 3c 40 00 00 00 50 3d 02 02 00 0d c0 35 00 01 0a 0b 0c 0d 40 00 00 00 01 40 01 00 +00 00 00 4b 00 00 01 00 36 40 44 00 00 01 00 35 00 3a 38 02 d8 01 2f a7 20 2f a8 00 00 f4 4c 08 0a 02 80 00 51 40 00 27 20 28 14 00 67 40 00 00 22 28 14 00 3c 40 00 00 00 50 3d 02 00 02 0d c0 35 00 01 0a 0b 0c 0d 40 00 00 00 01 40 01 00 ==> RAB ASSIGNMENT COMMAND (DATA) <RANAP_ProtocolIE-FieldPair> @@ -113,7 +113,7 @@ <firstCriticality><reject/></firstCriticality> <firstValue> 38 04 10 DE 18 69 FF 80 0C 34 FF 00 1F 40 08 06 - 08 9E 00 04 00 1B 80 35 00 01 1A 1B 1C 1D 00 11 + 08 9E 00 00 04 1B 80 35 00 01 1A 1B 1C 1D 00 11 22 33 44 </firstValue> <secondCriticality><ignore/></secondCriticality> @@ -124,12 +124,12 @@ <criticality><ignore/></criticality> <value> 00 00 01 00 35 00 23 38 04 10 DE 18 69 FF 80 0C - 34 FF 00 1F 40 08 06 08 9E 00 04 00 1B 80 35 00 + 34 FF 00 1F 40 08 06 08 9E 00 00 04 1B 80 35 00 01 1A 1B 1C 1D 00 11 22 33 44 40 06 78 1C 00 00 00 00 </value> </RANAP_IE> -00 00 00 39 00 00 01 00 36 40 32 00 00 01 00 35 00 23 38 04 10 de 18 69 ff 80 0c 34 ff 00 1f 40 08 06 08 9e 00 04 00 1b 80 35 00 01 1a 1b 1c 1d 00 11 22 33 44 40 06 78 1c 00 00 00 00 +00 00 00 39 00 00 01 00 36 40 32 00 00 01 00 35 00 23 38 04 10 de 18 69 ff 80 0c 34 ff 00 1f 40 08 06 08 9e 00 00 04 1b 80 35 00 01 1a 1b 1c 1d 00 11 22 33 44 40 06 78 1c 00 00 00 00 ==> RESET CMD <RANAP_IE> 3. testsuite.at:18: 3. ranap (testsuite.at:18): FAILED (testsuite.at:21) ]]] I'm not sure how this reversal came to be in test-ranap.ok. All I know is it works in master's HEAD, but not in 14da5411a4fbe05eccff5b4f0. ~Neels -- - Neels Hofmeyr <nhofmeyr(a)sysmocom.de>
http://www.sysmocom.de/
======================================================================= * sysmocom - systems for mobile communications GmbH * Alt-Moabit 93 * 10559 Berlin, Germany * Sitz / Registered office: Berlin, HRB 134158 B * Geschäftsführer / Managing Directors: Holger Freyther, Harald Welte
9 years, 1 month
2
2
0
0
[PATCH] Make random MSISDN assignment optional
by msuraev@sysmocom.de
From: Max <msuraev(a)sysmocom.de> Previously if subscriber was automatically created it got assigned random MSISDN number between 20000 and 49999. Make it optional (defaulting to previous behavior) by adding following: * optional "no-extension" argument to subscriber-create-on-demand * db unit tests * vty test The range for random extension can now be specified with "subscriber-create-on-demand random" command. Fixes: OS#1658 --- openbsc/include/openbsc/db.h | 8 ++- openbsc/include/openbsc/gsm_data.h | 8 +++ openbsc/include/openbsc/gsm_subscriber.h | 5 +- openbsc/src/libbsc/net_init.c | 5 +- openbsc/src/libcommon/gsm_subscriber_base.c | 1 + openbsc/src/libmsc/ctrl_commands.c | 9 ++- openbsc/src/libmsc/db.c | 37 +++++++---- openbsc/src/libmsc/gsm_04_08.c | 12 +++- openbsc/src/libmsc/gsm_subscriber.c | 6 +- openbsc/src/libmsc/vty_interface_layer3.c | 51 +++++++++++++-- openbsc/tests/db/db_test.c | 99 +++++++++++++---------------- openbsc/tests/vty_test_runner.py | 14 ++++ 12 files changed, 169 insertions(+), 86 deletions(-) diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h index 6699a86..4da9634 100644 --- a/openbsc/include/openbsc/db.h +++ b/openbsc/include/openbsc/db.h @@ -20,6 +20,8 @@ #ifndef _DB_H #define _DB_H +#include <stdbool.h> + #include "gsm_subscriber.h" struct gsm_equipment; @@ -35,13 +37,15 @@ 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 smin, + uint64_t smax, bool ext); 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 smin, + uint64_t smax); 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 6d7aba3..14b002a 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -18,6 +18,12 @@ struct gsm_subscriber_group; #define OBSC_LINKID_CB(__msgb) (__msgb)->cb[3] +enum gsm_subscr_ext { + GSM_SUBSCR_DONT_CREATE = 0, + GSM_SUBSCR_RANDOM_EXT = 1, + GSM_SUBSCR_NO_EXT = 2 +}; + enum gsm_security_event { GSM_SECURITY_NOAVAIL, GSM_SECURITY_AUTH_FAILED, @@ -283,6 +289,8 @@ struct gsm_network { /* subscriber related features */ int create_subscriber; + uint64_t ext_min; + uint64_t ext_max; struct gsm_subscriber_group *subscr_group; struct gsm_sms_queue *sms_queue; diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h index 7d6c776..5030d65 100644 --- a/openbsc/include/openbsc/gsm_subscriber.h +++ b/openbsc/include/openbsc/gsm_subscriber.h @@ -1,6 +1,8 @@ #ifndef _GSM_SUBSCR_H #define _GSM_SUBSCR_H +#include <stdbool.h> + #include "gsm_data.h" #include <osmocom/core/linuxlist.h> @@ -91,7 +93,8 @@ enum gsm_subscriber_update_reason { struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp, - const char *imsi); + const char *imsi, uint64_t smin, + uint64_t smax, bool ext); struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_subscriber_group *sgrp, uint32_t tmsi); struct gsm_subscriber *subscr_get_by_imsi(struct gsm_subscriber_group *sgrp, diff --git a/openbsc/src/libbsc/net_init.c b/openbsc/src/libbsc/net_init.c index 568a0b8..a524ead 100644 --- a/openbsc/src/libbsc/net_init.c +++ b/openbsc/src/libbsc/net_init.c @@ -48,7 +48,7 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod INIT_LLIST_HEAD(&net->bsc_data->mscs); net->subscr_group->net = net; - net->create_subscriber = 1; + net->create_subscriber = GSM_SUBSCR_RANDOM_EXT; net->country_code = country_code; net->network_code = network_code; @@ -104,7 +104,8 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod net->stats.bts.rsl_fail = osmo_counter_alloc("net.bts.rsl_fail"); net->mncc_recv = mncc_recv; - + net->ext_min = GSM_MIN_EXTEN; + net->ext_max = GSM_MAX_EXTEN; gsm_net_update_ctype(net); return net; diff --git a/openbsc/src/libcommon/gsm_subscriber_base.c b/openbsc/src/libcommon/gsm_subscriber_base.c index a455824..5f0a1be 100644 --- a/openbsc/src/libcommon/gsm_subscriber_base.c +++ b/openbsc/src/libcommon/gsm_subscriber_base.c @@ -60,6 +60,7 @@ struct gsm_subscriber *subscr_alloc(void) llist_add_tail(&s->entry, &active_subscribers); s->use_count = 1; s->tmsi = GSM_RESERVED_TMSI; + s->extension[0] = '\0'; INIT_LLIST_HEAD(&s->requests); diff --git a/openbsc/src/libmsc/ctrl_commands.c b/openbsc/src/libmsc/ctrl_commands.c index 9ac39de..44b1ebd 100644 --- a/openbsc/src/libmsc/ctrl_commands.c +++ b/openbsc/src/libmsc/ctrl_commands.c @@ -18,6 +18,9 @@ * along with this program. If not, see <
http://www.gnu.org/licenses/
>. * */ + +#include <stdbool.h> + #include <osmocom/ctrl/control_cmd.h> #include <openbsc/gsm_data.h> #include <openbsc/gsm_subscriber.h> @@ -83,6 +86,8 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) char *tmp, *imsi, *msisdn, *alg, *ki, *saveptr = NULL; struct gsm_subscriber* subscr; int rc; + bool ext = (GSM_SUBSCR_RANDOM_EXT == net->create_subscriber) ? true : + false; tmp = talloc_strdup(cmd, cmd->value); if (!tmp) @@ -95,7 +100,9 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) subscr = subscr_get_by_imsi(net->subscr_group, imsi); if (!subscr) - subscr = subscr_create_subscriber(net->subscr_group, imsi); + subscr = subscr_create_subscriber(net->subscr_group, imsi, + net->ext_min, + net->ext_max, ext); if (!subscr) goto fail; diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 267b5ef..5e55433 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -23,6 +23,7 @@ #include <inttypes.h> #include <libgen.h> #include <stdio.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <errno.h> @@ -500,7 +501,8 @@ 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 smin, + uint64_t smax, bool ext) { dbi_result result; struct gsm_subscriber *subscr; @@ -532,7 +534,8 @@ 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); + if (ext) + db_subscriber_alloc_exten(subscr, smin, smax); return subscr; } @@ -937,8 +940,11 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) dbi_conn_quote_string_copy(conn, subscriber->name, &q_name); - dbi_conn_quote_string_copy(conn, - subscriber->extension, &q_extension); + if ('\0' != subscriber->extension[0]) + dbi_conn_quote_string_copy(conn, + subscriber->extension, &q_extension); + else + q_extension = strdup("NULL"); if (subscriber->tmsi != GSM_RESERVED_TMSI) { sprintf(tmsi, "%u", subscriber->tmsi); @@ -1043,15 +1049,17 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result); - result = dbi_conn_queryf(conn, - "DELETE FROM SMS WHERE src_addr=%s OR dest_addr=%s", - subscr->extension, subscr->extension); - if (!result) { - LOGP(DDB, LOGL_ERROR, - "Failed to delete SMS for %llu\n", subscr->id); - return -1; + if ('\0' != subscr->extension[0]) { + result = dbi_conn_queryf(conn, + "DELETE FROM SMS WHERE src_addr=%s OR dest_addr=%s", + subscr->extension, subscr->extension); + if (!result) { + LOGP(DDB, LOGL_ERROR, + "Failed to delete SMS for %llu\n", subscr->id); + return -1; + } + dbi_result_free(result); } - dbi_result_free(result); result = dbi_conn_queryf(conn, "DELETE FROM VLR WHERE subscriber_id=%llu", @@ -1231,13 +1239,14 @@ 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 smin, + uint64_t smax) { dbi_result result = NULL; uint32_t try; for (;;) { - try = (rand()%(GSM_MAX_EXTEN-GSM_MIN_EXTEN+1)+GSM_MIN_EXTEN); + try = (rand() % (smax - smin + 1) + smin); result = dbi_conn_queryf(conn, "SELECT * FROM Subscriber " "WHERE extension = %i", diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c index 05cb886..d22db73 100644 --- a/openbsc/src/libmsc/gsm_04_08.c +++ b/openbsc/src/libmsc/gsm_04_08.c @@ -25,6 +25,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdbool.h> #include <errno.h> #include <time.h> #include <netinet/in.h> @@ -517,6 +518,8 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms struct gsm_network *net = bts->network; uint8_t mi_type = gh->data[1] & GSM_MI_TYPE_MASK; char mi_string[GSM48_MI_SIZE]; + bool ext = (GSM_SUBSCR_RANDOM_EXT == net->create_subscriber) ? true : + false; gsm48_mi_to_string(mi_string, sizeof(mi_string), &gh->data[1], gh->data[0]); DEBUGP(DMM, "IDENTITY RESPONSE: MI(%s)=%s\n", @@ -532,7 +535,8 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms mi_string); if (!conn->subscr && net->create_subscriber) conn->subscr = subscr_create_subscriber( - net->subscr_group, mi_string); + net->subscr_group, mi_string, + net->ext_min, net->ext_max, ext); } if (!conn->subscr && conn->loc_operation) { gsm0408_loc_upd_rej(conn, bts->network->reject_cause); @@ -593,6 +597,8 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb struct gsm_bts *bts = conn->bts; uint8_t mi_type; char mi_string[GSM48_MI_SIZE]; + bool ext = (GSM_SUBSCR_RANDOM_EXT == bts->network->create_subscriber) ? + true : false; lu = (struct gsm48_loc_upd_req *) gh->data; @@ -643,7 +649,9 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb subscr = subscr_get_by_imsi(bts->network->subscr_group, mi_string); if (!subscr && bts->network->create_subscriber) { subscr = subscr_create_subscriber( - bts->network->subscr_group, mi_string); + bts->network->subscr_group, mi_string, + bts->network->ext_min, bts->network->ext_max, + ext); } if (!subscr) { gsm0408_loc_upd_rej(conn, bts->network->reject_cause); diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c index 57c10cf..7d62888 100644 --- a/openbsc/src/libmsc/gsm_subscriber.c +++ b/openbsc/src/libmsc/gsm_subscriber.c @@ -203,9 +203,11 @@ void subscr_remove_request(struct subscr_request *request) } struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp, - const char *imsi) + const char *imsi, uint64_t smin, + uint64_t smax, bool ext) { - struct gsm_subscriber *subscr = db_create_subscriber(imsi); + struct gsm_subscriber *subscr = + db_create_subscriber(imsi, smin, smax, ext); if (subscr) subscr->group = sgrp; return subscr; diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c index 790fedf..51b7258 100644 --- a/openbsc/src/libmsc/vty_interface_layer3.c +++ b/openbsc/src/libmsc/vty_interface_layer3.c @@ -21,6 +21,8 @@ #include <stdlib.h> #include <limits.h> #include <unistd.h> +#include <stdbool.h> +#include <inttypes.h> #include <time.h> #include <osmocom/vty/command.h> @@ -235,12 +237,16 @@ DEFUN(subscriber_create, { struct gsm_network *gsmnet = gsmnet_from_vty(vty); struct gsm_subscriber *subscr; + bool ext = (GSM_SUBSCR_RANDOM_EXT == gsmnet->create_subscriber) ? true : + false; subscr = subscr_get_by_imsi(gsmnet->subscr_group, argv[0]); if (subscr) db_sync_subscriber(subscr); else { - subscr = subscr_create_subscriber(gsmnet->subscr_group, argv[0]); + subscr = subscr_create_subscriber(gsmnet->subscr_group, argv[0], + gsmnet->ext_min, + gsmnet->ext_max, ext); if (!subscr) { vty_out(vty, "%% No subscriber created for IMSI %s%s", @@ -1032,11 +1038,33 @@ DEFUN(cfg_nitb, cfg_nitb_cmd, } DEFUN(cfg_nitb_subscr_create, cfg_nitb_subscr_create_cmd, - "subscriber-create-on-demand", - "Make a new record when a subscriber is first seen.\n") + "subscriber-create-on-demand [no-extension]", + "Make a new record when a subscriber is first seen.\n" + "Do not assign random extension when creating subscriber\n") { struct gsm_network *gsmnet = gsmnet_from_vty(vty); - gsmnet->create_subscriber = 1; + if (argc) + gsmnet->create_subscriber = GSM_SUBSCR_NO_EXT; + else + gsmnet->create_subscriber = GSM_SUBSCR_RANDOM_EXT; + return CMD_SUCCESS; +} + +DEFUN(cfg_nitb_subscr_random, cfg_nitb_subscr_random_cmd, + "subscriber-create-on-demand random <1-99999> <2-99999>", + "Set random parameters for a new record when a subscriber is first seen.\n" + "Set random parameters for a new record when a subscriber is first seen.\n" + "Minimum for subscriber extension\n""Maximum for subscriber extension\n") +{ + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + uint64_t mi = atoi(argv[0]), ma = atoi(argv[1]); + if (mi >= ma) { + vty_out(vty, "Incorrect range: %s >= %s, expected MIN < MAX%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + gsmnet->ext_min = mi; + gsmnet->ext_max = ma; return CMD_SUCCESS; } @@ -1045,7 +1073,7 @@ DEFUN(cfg_nitb_no_subscr_create, cfg_nitb_no_subscr_create_cmd, NO_STR "Make a new record when a subscriber is first seen.\n") { struct gsm_network *gsmnet = gsmnet_from_vty(vty); - gsmnet->create_subscriber = 0; + gsmnet->create_subscriber = GSM_SUBSCR_DONT_CREATE; return CMD_SUCCESS; } @@ -1070,9 +1098,17 @@ DEFUN(cfg_nitb_no_assign_tmsi, cfg_nitb_no_assign_tmsi_cmd, static int config_write_nitb(struct vty *vty) { struct gsm_network *gsmnet = gsmnet_from_vty(vty); + const char *pref = gsmnet->create_subscriber ? "" : "no ", *post = + (GSM_SUBSCR_NO_EXT == gsmnet->create_subscriber) ? + " no-extension" : ""; + vty_out(vty, "nitb%s", VTY_NEWLINE); - vty_out(vty, " %ssubscriber-create-on-demand%s", - gsmnet->create_subscriber ? "" : "no ", VTY_NEWLINE); + vty_out(vty, " %ssubscriber-create-on-demand%s%s", pref, post, + VTY_NEWLINE); + if (gsmnet->ext_min != GSM_MIN_EXTEN || gsmnet->ext_max != GSM_MAX_EXTEN) + vty_out(vty, "subscriber-create-on-demand random %"PRIu64" %" + PRIu64"%s", gsmnet->ext_min, gsmnet->ext_max, + VTY_NEWLINE); vty_out(vty, " %sassign-tmsi%s", gsmnet->avoid_tmsi ? "no " : "", VTY_NEWLINE); return CMD_SUCCESS; @@ -1127,6 +1163,7 @@ int bsc_vty_init_extra(void) install_element(CONFIG_NODE, &cfg_nitb_cmd); install_node(&nitb_node, config_write_nitb); install_element(NITB_NODE, &cfg_nitb_subscr_create_cmd); + install_element(NITB_NODE, &cfg_nitb_subscr_random_cmd); install_element(NITB_NODE, &cfg_nitb_no_subscr_create_cmd); install_element(NITB_NODE, &cfg_nitb_assign_tmsi_cmd); install_element(NITB_NODE, &cfg_nitb_no_assign_tmsi_cmd); diff --git a/openbsc/tests/db/db_test.c b/openbsc/tests/db/db_test.c index fb159a5..a689789 100644 --- a/openbsc/tests/db/db_test.c +++ b/openbsc/tests/db/db_test.c @@ -28,6 +28,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdbool.h> #include <inttypes.h> static struct gsm_network dummy_net; @@ -159,10 +160,44 @@ static void test_sms_migrate(void) subscr_put(rcv_subscr); } -int main() +static void test_subs(const char *alice_imsi, char *imei1, char *imei2, bool ext) { + struct gsm_subscriber *alice = NULL, *alice_db; char scratch_str[256]; + alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, + ext); + db_subscriber_assoc_imei(alice, imei1); + if (imei2) + db_subscriber_assoc_imei(alice, imei2); + db_subscriber_alloc_tmsi(alice); + alice->lac=42; + db_sync_subscriber(alice); + /* Get by TMSI */ + snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); + alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + /* Get by IMSI */ + alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi); + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + /* Get by id */ + snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); + alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + /* Get by extension */ + alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); + if (alice_db) { + COMPARE(alice, alice_db); + SUBSCR_PUT(alice_db); + } + SUBSCR_PUT(alice); +} + +int main() +{ printf("Testing subscriber database code.\n"); osmo_init_logging(&log_info); log_set_print_filename(osmo_stderr_target, 0); @@ -186,68 +221,22 @@ int main() struct gsm_subscriber *alice_db; char *alice_imsi = "3243245432345"; - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, + true); db_sync_subscriber(alice); alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice->imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); SUBSCR_PUT(alice); - alice_imsi = "3693245423445"; - alice = db_create_subscriber(alice_imsi); - db_subscriber_assoc_imei(alice, "1234567890"); - db_subscriber_alloc_tmsi(alice); - alice->lac=42; - db_sync_subscriber(alice); - /* Get by TMSI */ - snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by IMSI */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by id */ - snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by extension */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - SUBSCR_PUT(alice); - - alice_imsi = "9993245423445"; - alice = db_create_subscriber(alice_imsi); - db_subscriber_alloc_tmsi(alice); - alice->lac=42; - db_sync_subscriber(alice); - db_subscriber_assoc_imei(alice, "1234567890"); - db_subscriber_assoc_imei(alice, "6543560920"); - /* Get by TMSI */ - snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by IMSI */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by id */ - snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); - alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - /* Get by extension */ - alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); - COMPARE(alice, alice_db); - SUBSCR_PUT(alice_db); - SUBSCR_PUT(alice); + test_subs("3693245423445", "1234567890", NULL, true); + test_subs("9993245423445", "1234567890", "6543560920", true); + test_subs("3123122223445", "1234567890", NULL, false); + test_subs("9123121223445", "1234567890", "6543560920", false); /* create it again and see it fails */ - alice = db_create_subscriber(alice_imsi); + alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, + true); OSMO_ASSERT(!alice); test_sms(); diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index c088855..6c49a03 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -408,11 +408,13 @@ class TestVTYNITB(TestVTYGenericBSC): self.vty.enable() imsi = "204300854013739" + imsi2 = "204300854013769" wrong_imsi = "204300999999999" # Lets create one res = self.vty.command('subscriber create imsi '+imsi) self.assert_(res.find(" IMSI: "+imsi) > 0) + self.assert_(res.find("Extension") > 0) self.vty.verify('subscriber imsi '+wrong_imsi+' name wrong', ['% No subscriber found for imsi '+wrong_imsi]) res = self.vty.command('subscriber imsi '+imsi+' name '+('X' * 160)) @@ -426,9 +428,21 @@ class TestVTYNITB(TestVTYGenericBSC): self.vty.verify('subscriber imsi '+imsi+' extension '+('1' * 14), ['']) + # Another one - without extension + self.vty.command("configure terminal") + self.vty.command("nitb") + self.vty.command("subscriber-create-on-demand no-extension") + self.vty.command("end") + + res = self.vty.command('subscriber create imsi ' + imsi2) + self.assert_(res.find(" IMSI: " + imsi2) > 0) + self.assertEquals(res.find("Extension"), -1) + # Delete it res = self.vty.command('subscriber delete imsi '+imsi) self.assert_(res != "") + res = self.vty.command('subscriber delete imsi ' + imsi2) + self.assert_(res != "") def testShowPagingGroup(self): res = self.vty.command("show paging-group 255 1234567") -- 2.8.1
9 years, 1 month
1
0
0
0
test mailman archive..
by Holger Freyther
test
9 years, 1 month
1
0
0
0
← Newer
1
...
14
15
16
17
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Results per page:
10
25
50
100
200