From c7fc2cdd2a2b105f51ca86e974e1096f0a8d4202 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 9 Jan 2013 15:44:16 +0100 Subject: HACK: Allow each BTS to have a different MCC/MNC for testing purposes --- openbsc/configure.ac | 2 +- openbsc/doc/examples/osmo-nitb/nanobts/openbsc.cfg | 8 +-- openbsc/include/openbsc/gsm_data.h | 7 +-- openbsc/include/openbsc/gsm_data_shared.h | 6 +++ openbsc/include/openbsc/gsm_subscriber.h | 2 + openbsc/src/ipaccess/ipaccess-config.c | 2 +- openbsc/src/libbsc/bsc_ctrl_commands.c | 42 ++++++++------- openbsc/src/libbsc/bsc_init.c | 8 ++- openbsc/src/libbsc/bsc_vty.c | 63 +++++++++++----------- openbsc/src/libbsc/paging.c | 20 ++++++- openbsc/src/libbsc/system_information.c | 12 ++--- openbsc/src/libcommon/gsm_data.c | 9 ++-- openbsc/src/libcommon/gsm_data_shared.c | 6 +++ openbsc/src/libmsc/db.c | 16 +++++- openbsc/src/libmsc/gsm_04_08.c | 21 ++++---- openbsc/src/libmsc/gsm_subscriber.c | 2 + openbsc/src/libmsc/vty_interface_layer3.c | 8 ++- openbsc/src/utils/bs11_config.c | 2 +- openbsc/tests/channel/channel_test.c | 2 +- 19 files changed, 137 insertions(+), 101 deletions(-) diff --git a/openbsc/configure.ac b/openbsc/configure.ac index 5e705c767..3391eb401 100644 --- a/openbsc/configure.ac +++ b/openbsc/configure.ac @@ -45,7 +45,7 @@ AC_ARG_ENABLE([osmo-bsc], [AS_HELP_STRING([--enable-osmo-bsc], [Build the Osmo B if test "$osmo_ac_build_bsc" = "yes" ; then PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.6) fi -AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes") +AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "NOT_DISABLED") AC_SUBST(osmo_ac_build_bsc) # Enable/disable smpp support in the nitb? diff --git a/openbsc/doc/examples/osmo-nitb/nanobts/openbsc.cfg b/openbsc/doc/examples/osmo-nitb/nanobts/openbsc.cfg index 7a443087c..e222255a0 100644 --- a/openbsc/doc/examples/osmo-nitb/nanobts/openbsc.cfg +++ b/openbsc/doc/examples/osmo-nitb/nanobts/openbsc.cfg @@ -9,10 +9,6 @@ line vty e1_input e1_line 0 driver ipa network - network country code 1 - mobile network code 1 - short name OpenBSC - long name OpenBSC auth policy closed location updating reject cause 13 encryption a5 0 @@ -38,6 +34,10 @@ network timer t3119 0 timer t3141 0 bts 0 + network country code 1 + mobile network code 1 + short name OpenBSC + long name OpenBSC type nanobts band DCS1800 cell_identity 0 diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 254feaf86..523641a86 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -205,10 +205,6 @@ enum gsm_auth_policy { struct gsm_network { /* global parameters */ - uint16_t country_code; - uint16_t network_code; - char *name_long; - char *name_short; enum gsm_auth_policy auth_policy; enum gsm48_reject_value reject_cause; int a5_encryption; @@ -328,8 +324,7 @@ struct gsm_sms { char text[SMS_TEXT_SIZE]; }; -struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code, - int (*mncc_recv)(struct gsm_network *, struct msgb *)); +struct gsm_network *gsm_network_init(int (*mncc_recv)(struct gsm_network *, struct msgb *)); int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type); /* Get reference to a neighbor cell on a given BCCH ARFCN */ diff --git a/openbsc/include/openbsc/gsm_data_shared.h b/openbsc/include/openbsc/gsm_data_shared.h index 0704bd753..217474f17 100644 --- a/openbsc/include/openbsc/gsm_data_shared.h +++ b/openbsc/include/openbsc/gsm_data_shared.h @@ -731,6 +731,12 @@ struct gsm_bts { struct bts_codec_conf codec; #endif /* ROLE_BSC */ void *role; + + /* hacks for some network tweaks... */ + uint16_t country_code; + uint16_t network_code; + char *name_long; + char *name_short; }; diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h index 7aae4c332..8622aff07 100644 --- a/openbsc/include/openbsc/gsm_subscriber.h +++ b/openbsc/include/openbsc/gsm_subscriber.h @@ -36,6 +36,8 @@ struct gsm_subscriber { long long unsigned int id; char imsi[GSM_IMSI_LENGTH]; uint32_t tmsi; + uint16_t mnc; + uint16_t mcc; uint16_t lac; char name[GSM_NAME_LENGTH]; char extension[GSM_EXTENSION_LENGTH]; diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c index c42c7bb9c..d74d45ec9 100644 --- a/openbsc/src/ipaccess/ipaccess-config.c +++ b/openbsc/src/ipaccess/ipaccess-config.c @@ -983,7 +983,7 @@ int main(int argc, char **argv) } libosmo_abis_init(tall_ctx_config); - bsc_gsmnet = gsm_network_init(1, 1, NULL); + bsc_gsmnet = gsm_network_init(NULL); if (!bsc_gsmnet) exit(1); diff --git a/openbsc/src/libbsc/bsc_ctrl_commands.c b/openbsc/src/libbsc/bsc_ctrl_commands.c index 3cd0ee379..a9ea4f14b 100644 --- a/openbsc/src/libbsc/bsc_ctrl_commands.c +++ b/openbsc/src/libbsc/bsc_ctrl_commands.c @@ -61,10 +61,10 @@ static int verify_vty_description_string(struct ctrl_cmd *cmd, return 0; } -CTRL_CMD_DEFINE_RANGE(net_mnc, "mnc", struct gsm_network, network_code, 0, 999); -CTRL_CMD_DEFINE_RANGE(net_mcc, "mcc", struct gsm_network, country_code, 1, 999); -CTRL_CMD_VTY_STRING(net_short_name, "short-name", struct gsm_network, name_short); -CTRL_CMD_VTY_STRING(net_long_name, "long-name", struct gsm_network, name_long); +CTRL_CMD_DEFINE_RANGE(bts_mnc, "mnc", struct gsm_bts, network_code, 0, 999); +CTRL_CMD_DEFINE_RANGE(bts_mcc, "mcc", struct gsm_bts, country_code, 1, 999); +CTRL_CMD_VTY_STRING(bts_short_name, "short-name", struct gsm_bts, name_short); +CTRL_CMD_VTY_STRING(bts_long_name, "long-name", struct gsm_bts, name_long); static int verify_net_apply_config(struct ctrl_cmd *cmd, const char *v, void *d) { @@ -95,7 +95,7 @@ static int set_net_apply_config(struct ctrl_cmd *cmd, void *data) CTRL_CMD_DEFINE(net_apply_config, "apply-configuration"); -static int verify_net_mcc_mnc_apply(struct ctrl_cmd *cmd, const char *value, void *d) +static int verify_bts_mcc_mnc_apply(struct ctrl_cmd *cmd, const char *value, void *d) { char *tmp, *saveptr, *mcc, *mnc; @@ -112,15 +112,15 @@ static int verify_net_mcc_mnc_apply(struct ctrl_cmd *cmd, const char *value, voi return 0; } -static int get_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) +static int get_bts_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) { cmd->reply = "Write only attribute"; return CTRL_CMD_ERROR; } -static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) +static int set_bts_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) { - struct gsm_network *net = cmd->node; + struct gsm_bts *bts = cmd->node; char *tmp, *saveptr, *mcc_str, *mnc_str; int mcc, mnc; @@ -137,21 +137,25 @@ static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) talloc_free(tmp); - if (net->network_code == mnc && net->country_code == mcc) { + if (bts->network_code == mnc && bts->country_code == mcc) { cmd->reply = "Nothing changed"; return CTRL_CMD_REPLY; } - net->network_code = mnc; - net->country_code = mcc; + bts->network_code = mnc; + bts->country_code = mcc; + + if (is_ipaccess_bts(bts)) + ipaccess_drop_oml(bts); - return set_net_apply_config(cmd, data); + cmd->reply = "Tried to drop the BTS"; + return CTRL_CMD_REPLY; oom: cmd->reply = "OOM"; return CTRL_CMD_ERROR; } -CTRL_CMD_DEFINE(net_mcc_mnc_apply, "mcc-mnc-apply"); +CTRL_CMD_DEFINE(bts_mcc_mnc_apply, "mcc-mnc-apply"); /* TRX related commands below here */ CTRL_HELPER_GET_INT(trx_max_power, struct gsm_bts_trx, max_power_red); @@ -196,12 +200,12 @@ CTRL_CMD_DEFINE(trx_max_power, "max-power-reduction"); int bsc_base_ctrl_cmds_install(void) { int rc = 0; - rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mnc); - rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc); - rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_short_name); - rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_long_name); - rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_apply_config); - rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc_mnc_apply); + rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_net_apply_config); + rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_mnc); + rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_mcc); + rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_short_name); + rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_long_name); + rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_mcc_mnc_apply); rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_max_power); return rc; diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 796d02793..8781b947e 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -261,8 +261,8 @@ static void bootstrap_rsl(struct gsm_bts_trx *trx) LOGP(DRSL, LOGL_NOTICE, "bootstrapping RSL for BTS/TRX (%u/%u) " "on ARFCN %u using MCC=%u MNC=%u LAC=%u CID=%u BSIC=%u TSC=%u\n", - trx->bts->nr, trx->nr, trx->arfcn, bsc_gsmnet->country_code, - bsc_gsmnet->network_code, trx->bts->location_area_code, + trx->bts->nr, trx->nr, trx->arfcn, trx->bts->country_code, + trx->bts->network_code, trx->bts->location_area_code, trx->bts->cell_identity, trx->bts->bsic, trx->bts->tsc); if (trx->bts->type == GSM_BTS_TYPE_NOKIA_SITE) { @@ -464,12 +464,10 @@ int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), int rc; /* initialize our data structures */ - bsc_gsmnet = gsm_network_init(1, 1, mncc_recv); + bsc_gsmnet = gsm_network_init(mncc_recv); if (!bsc_gsmnet) return -ENOMEM; - bsc_gsmnet->name_long = talloc_strdup(bsc_gsmnet, "OpenBSC"); - bsc_gsmnet->name_short = talloc_strdup(bsc_gsmnet, "OpenBSC"); /* our vty command code expects vty->priv to point to a telnet_connection */ dummy_conn.priv = bsc_gsmnet; diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index 9129059e5..9220a6007 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -182,13 +182,8 @@ static void net_dump_vty(struct vty *vty, struct gsm_network *net) { struct pchan_load pl; - vty_out(vty, "BSC is on Country Code %u, Network Code %u " - "and has %u BTS%s", net->country_code, net->network_code, + vty_out(vty, "BSC has %u BTS%s", net->num_bts, VTY_NEWLINE); - vty_out(vty, " Long network name: '%s'%s", - net->name_long, VTY_NEWLINE); - vty_out(vty, " Short network name: '%s'%s", - net->name_short, VTY_NEWLINE); vty_out(vty, " Authentication policy: %s%s", gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE); vty_out(vty, " Location updating reject cause: %u%s", @@ -251,12 +246,16 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts) { struct pchan_load pl; - vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, " + vty_out(vty, "BTS %u is of %s type in band %s, has CI %u MCC %u MNC %u LAC %u, " "BSIC %u, TSC %u and %u TRX%s", bts->nr, btstype2str(bts->type), gsm_band_name(bts->band), - bts->cell_identity, + bts->cell_identity, bts->country_code, bts->network_code, bts->location_area_code, bts->bsic, bts->tsc, bts->num_trx, VTY_NEWLINE); + vty_out(vty, "Long network name: '%s'%s", + bts->name_long, VTY_NEWLINE); + vty_out(vty, "Short network name: '%s'%s", + bts->name_short, VTY_NEWLINE); vty_out(vty, "Description: %s%s", bts->description ? bts->description : "(null)", VTY_NEWLINE); vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE); @@ -487,6 +486,10 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts) vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE); if (bts->description) vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE); + vty_out(vty, " network country code %u%s", bts->country_code, VTY_NEWLINE); + vty_out(vty, " mobile network code %u%s", bts->network_code, VTY_NEWLINE); + vty_out(vty, " short name %s%s", bts->name_short, VTY_NEWLINE); + vty_out(vty, " long name %s%s", bts->name_long, VTY_NEWLINE); vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE); vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE); vty_out(vty, " location_area_code %u%s", bts->location_area_code, @@ -669,10 +672,6 @@ static int config_write_net(struct vty *vty) struct gsm_network *gsmnet = gsmnet_from_vty(vty); vty_out(vty, "network%s", VTY_NEWLINE); - vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE); - vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE); - vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE); - vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE); vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE); vty_out(vty, " location updating reject cause %u%s", gsmnet->reject_cause, VTY_NEWLINE); @@ -1209,55 +1208,55 @@ DEFUN(cfg_net, return CMD_SUCCESS; } -DEFUN(cfg_net_ncc, - cfg_net_ncc_cmd, +DEFUN(cfg_bts_ncc, + cfg_bts_ncc_cmd, "network country code <1-999>", "Set the GSM network country code\n" "Country commands\n" CODE_CMD_STR "Network Country Code to use\n") { - struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_bts *bts = vty->index; - gsmnet->country_code = atoi(argv[0]); + bts->country_code = atoi(argv[0]); return CMD_SUCCESS; } -DEFUN(cfg_net_mnc, - cfg_net_mnc_cmd, +DEFUN(cfg_bts_mnc, + cfg_bts_mnc_cmd, "mobile network code <0-999>", "Set the GSM mobile network code\n" "Network Commands\n" CODE_CMD_STR "Mobile Network Code to use\n") { - struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_bts *bts = vty->index; - gsmnet->network_code = atoi(argv[0]); + bts->network_code = atoi(argv[0]); return CMD_SUCCESS; } -DEFUN(cfg_net_name_short, - cfg_net_name_short_cmd, +DEFUN(cfg_bts_name_short, + cfg_bts_name_short_cmd, "short name NAME", "Set the short GSM network name\n" NAME_CMD_STR NAME_STR) { - struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_bts *bts = vty->index; - bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]); + bsc_replace_string(bts, &bts->name_short, argv[0]); return CMD_SUCCESS; } -DEFUN(cfg_net_name_long, - cfg_net_name_long_cmd, +DEFUN(cfg_bts_name_long, + cfg_bts_name_long_cmd, "long name NAME", "Set the long GSM network name\n" NAME_CMD_STR NAME_STR) { - struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_bts *bts = vty->index; - bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]); + bsc_replace_string(bts, &bts->name_long, argv[0]); return CMD_SUCCESS; } @@ -3281,10 +3280,6 @@ int bsc_vty_init(const struct log_info *cat) install_element(CONFIG_NODE, &cfg_net_cmd); install_node(&net_node, config_write_net); vty_install_default(GSMNET_NODE); - install_element(GSMNET_NODE, &cfg_net_ncc_cmd); - install_element(GSMNET_NODE, &cfg_net_mnc_cmd); - install_element(GSMNET_NODE, &cfg_net_name_short_cmd); - install_element(GSMNET_NODE, &cfg_net_name_long_cmd); install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd); install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd); install_element(GSMNET_NODE, &cfg_net_encryption_cmd); @@ -3317,6 +3312,10 @@ int bsc_vty_init(const struct log_info *cat) install_element(GSMNET_NODE, &cfg_bts_cmd); install_node(&bts_node, config_write_bts); vty_install_default(BTS_NODE); + install_element(BTS_NODE, &cfg_bts_ncc_cmd); + install_element(BTS_NODE, &cfg_bts_mnc_cmd); + install_element(BTS_NODE, &cfg_bts_name_short_cmd); + install_element(BTS_NODE, &cfg_bts_name_long_cmd); install_element(BTS_NODE, &cfg_bts_type_cmd); install_element(BTS_NODE, &cfg_description_cmd); install_element(BTS_NODE, &cfg_no_description_cmd); diff --git a/openbsc/src/libbsc/paging.c b/openbsc/src/libbsc/paging.c index 286c57ba9..6ce17f896 100644 --- a/openbsc/src/libbsc/paging.c +++ b/openbsc/src/libbsc/paging.c @@ -303,9 +303,23 @@ int paging_request_bts(struct gsm_bts *bts, struct gsm_subscriber *subscr, { int rc; + /* not the right network */ + if (bts->network_code != subscr->mnc || bts->country_code != subscr->mcc) { + LOGP(DPAG, LOGL_DEBUG, + "BTS(%d) is not of the right network mnc(%d/%d) mcc(%d/%d)\n", + bts->nr, + bts->network_code, subscr->mnc, + bts->country_code, subscr->mcc); + return 0; + } + /* skip all currently inactive TRX */ - if (!trx_is_usable(bts->c0)) + if (!trx_is_usable(bts->c0)) { + LOGP(DPAG, LOGL_DEBUG, + "BTS(%d) is not usable.\n", + bts->nr); return 0; + } /* maybe it is the first time we use it */ paging_init_if_needed(bts); @@ -393,6 +407,10 @@ void paging_request_stop(struct gsm_bts *_bts, struct gsm_subscriber *subscr, if (!bts) break; + /* not the right network */ + if (bts->network_code != subscr->mnc || bts->country_code != subscr->mcc) + continue; + /* Stop paging */ if (bts != _bts) _paging_request_stop(bts, subscr, NULL, NULL); diff --git a/openbsc/src/libbsc/system_information.c b/openbsc/src/libbsc/system_information.c index a3deefc73..a9d6e7060 100644 --- a/openbsc/src/libbsc/system_information.c +++ b/openbsc/src/libbsc/system_information.c @@ -531,8 +531,8 @@ static int generate_si3(uint8_t *output, struct gsm_bts *bts) si3->header.system_information = GSM48_MT_RR_SYSINFO_3; si3->cell_identity = htons(bts->cell_identity); - gsm48_generate_lai(&si3->lai, bts->network->country_code, - bts->network->network_code, + gsm48_generate_lai(&si3->lai, bts->country_code, + bts->network_code, bts->location_area_code); si3->control_channel_desc = bts->si_common.chan_desc; si3->cell_options = bts->si_common.cell_options; @@ -570,8 +570,8 @@ static int generate_si4(uint8_t *output, struct gsm_bts *bts) si4->header.skip_indicator = 0; si4->header.system_information = GSM48_MT_RR_SYSINFO_4; - gsm48_generate_lai(&si4->lai, bts->network->country_code, - bts->network->network_code, + gsm48_generate_lai(&si4->lai, bts->country_code, + bts->network_code, bts->location_area_code); si4->cell_sel_par = bts->si_common.cell_sel_par; si4->rach_control = bts->si_common.rach_control; @@ -728,8 +728,8 @@ static int generate_si6(uint8_t *output, struct gsm_bts *bts) si6->skip_indicator = 0; si6->system_information = GSM48_MT_RR_SYSINFO_6; si6->cell_identity = htons(bts->cell_identity); - gsm48_generate_lai(&si6->lai, bts->network->country_code, - bts->network->network_code, + gsm48_generate_lai(&si6->lai, bts->country_code, + bts->network_code, bts->location_area_code); si6->cell_options = bts->si_common.cell_options; si6->ncc_permitted = bts->si_common.ncc_permitted; diff --git a/openbsc/src/libcommon/gsm_data.c b/openbsc/src/libcommon/gsm_data.c index 51444e7f5..b8e962995 100644 --- a/openbsc/src/libcommon/gsm_data.c +++ b/openbsc/src/libcommon/gsm_data.c @@ -70,8 +70,7 @@ int gsm_bts_model_register(struct gsm_bts_model *model) return 0; } -struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code, - int (*mncc_recv)(struct gsm_network *, struct msgb *)) +struct gsm_network *gsm_network_init(int (*mncc_recv)(struct gsm_network *, struct msgb *)) { struct gsm_network *net; @@ -90,8 +89,6 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod net->bsc_data->network = net; INIT_LLIST_HEAD(&net->bsc_data->mscs); - net->country_code = country_code; - net->network_code = network_code; net->num_bts = 0; net->reject_cause = GSM48_REJECT_ROAMING_NOT_ALLOWED; net->T3101 = GSM_T3101_DEFAULT; @@ -404,8 +401,8 @@ struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, enum gsm_bts_typ void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts) { - raid->mcc = bts->network->country_code; - raid->mnc = bts->network->network_code; + raid->mcc = bts->country_code; + raid->mnc = bts->network_code; raid->lac = bts->location_area_code; raid->rac = bts->gprs.rac; } diff --git a/openbsc/src/libcommon/gsm_data_shared.c b/openbsc/src/libcommon/gsm_data_shared.c index 8d5d0f85d..97f4c5fb4 100644 --- a/openbsc/src/libcommon/gsm_data_shared.c +++ b/openbsc/src/libcommon/gsm_data_shared.c @@ -276,6 +276,12 @@ struct gsm_bts *gsm_bts_alloc(void *ctx) bts->rach_ldavg_slots = -1; bts->paging.free_chans_need = -1; + /* hacks */ + bts->network_code = 1; + bts->country_code = 1; + bts->name_long = talloc_strdup(bts, "OpenBSC"); + bts->name_short = talloc_strdup(bts, "OpenBSC"); + return bts; } diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 656c661b7..2905ab580 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -82,6 +82,8 @@ static const char *create_stmts[] = { "extension TEXT UNIQUE, " "authorized INTEGER NOT NULL DEFAULT 0, " "tmsi TEXT UNIQUE, " + "mnc INTEGER NOT NULL DEFAULT 0, " + "mcc INTEGER NOT NULL DEFAULT 0, " "lac INTEGER NOT NULL DEFAULT 0, " "expire_lu TIMESTAMP DEFAULT NULL" ")", @@ -817,6 +819,8 @@ static void db_set_from_query(struct gsm_subscriber *subscr, dbi_conn result) strncpy(subscr->extension, string, GSM_EXTENSION_LENGTH); subscr->lac = dbi_result_get_ulonglong(result, "lac"); + subscr->mcc = dbi_result_get_uint(result, "mcc"); + subscr->mnc = dbi_result_get_uint(result, "mnc"); if (!dbi_result_field_is_null(result, "expire_lu")) subscr->expire_lu = dbi_result_get_datetime(result, "expire_lu"); @@ -889,9 +893,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, MNC %u, MCC %u, AUTH %u\n", subscr->id, subscr->imsi, subscr->name, subscr->tmsi, subscr->extension, - subscr->lac, subscr->authorized); + subscr->lac, subscr->mnc, subscr->mcc, subscr->authorized); dbi_result_free(result); get_equipment_by_subscr(subscr); @@ -956,6 +960,8 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) "authorized = %i, " "tmsi = %s, " "lac = %i, " + "mnc = %u, " + "mcc = %u, " "expire_lu = NULL " "WHERE imsi = %s ", q_name, @@ -963,6 +969,8 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) subscriber->authorized, q_tmsi, subscriber->lac, + subscriber->mnc, + subscriber->mcc, subscriber->imsi); } else { result = dbi_conn_queryf(conn, @@ -973,6 +981,8 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) "authorized = %i, " "tmsi = %s, " "lac = %i, " + "mnc = %u, " + "mcc = %u, " "expire_lu = datetime(%i, 'unixepoch') " "WHERE imsi = %s ", q_name, @@ -980,6 +990,8 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) subscriber->authorized, q_tmsi, subscriber->lac, + subscriber->mnc, + subscriber->mcc, (int) subscriber->expire_lu, subscriber->imsi); } diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c index db6fc5f70..cafeb4ce1 100644 --- a/openbsc/src/libmsc/gsm_04_08.c +++ b/openbsc/src/libmsc/gsm_04_08.c @@ -448,8 +448,8 @@ int gsm0408_loc_upd_acc(struct gsm_subscriber_connection *conn, uint32_t tmsi) gh->msg_type = GSM48_MT_MM_LOC_UPD_ACCEPT; lai = (struct gsm48_loc_area_id *) msgb_put(msg, sizeof(*lai)); - gsm48_generate_lai(lai, bts->network->country_code, - bts->network->network_code, bts->location_area_code); + gsm48_generate_lai(lai, bts->country_code, + bts->network_code, bts->location_area_code); mid = msgb_put(msg, GSM48_MID_TMSI_LEN); gsm48_generate_mid_from_tmsi(mid, tmsi); @@ -673,7 +673,6 @@ int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn) { struct msgb *msg = gsm48_msgb_alloc(); struct gsm48_hdr *gh; - struct gsm_network *net = conn->bts->network; struct gsm_bts *bts = conn->bts; uint8_t *ptr8; int name_len, name_pad; @@ -690,7 +689,7 @@ int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn) gh->proto_discr = GSM48_PDISC_MM; gh->msg_type = GSM48_MT_MM_INFO; - if (net->name_long) { + if (bts->name_long) { #if 0 name_len = strlen(net->name_long); /* 10.5.3.5a */ @@ -706,8 +705,8 @@ int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn) /* FIXME: Use Cell Broadcast, not UCS-2, since * UCS-2 is only supported by later revisions of the spec */ #endif - name_len = (strlen(net->name_long)*7)/8; - name_pad = (8 - strlen(net->name_long)*7)%8; + name_len = (strlen(bts->name_long)*7)/8; + name_pad = (8 - strlen(bts->name_long)*7)%8; if (name_pad > 0) name_len++; /* 10.5.3.5a */ @@ -717,11 +716,11 @@ int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn) ptr8[2] = 0x80 | name_pad; /* Cell Broadcast DCS, no CI */ ptr8 = msgb_put(msg, name_len); - gsm_7bit_encode(ptr8, net->name_long); + gsm_7bit_encode(ptr8, bts->name_long); } - if (net->name_short) { + if (bts->name_short) { #if 0 name_len = strlen(net->name_short); /* 10.5.3.5a */ @@ -734,8 +733,8 @@ int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn) for (i = 0; i < name_len; i++) ptr16[i] = htons(net->name_short[i]); #endif - name_len = (strlen(net->name_short)*7)/8; - name_pad = (8 - strlen(net->name_short)*7)%8; + name_len = (strlen(bts->name_short)*7)/8; + name_pad = (8 - strlen(bts->name_short)*7)%8; if (name_pad > 0) name_len++; /* 10.5.3.5a */ @@ -745,7 +744,7 @@ int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn) ptr8[2] = 0x80 | name_pad; /* Cell Broadcast DCS, no CI */ ptr8 = msgb_put(msg, name_len); - gsm_7bit_encode(ptr8, net->name_short); + gsm_7bit_encode(ptr8, bts->name_short); } diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c index bc6f3cf55..4fe0b30cc 100644 --- a/openbsc/src/libmsc/gsm_subscriber.c +++ b/openbsc/src/libmsc/gsm_subscriber.c @@ -373,6 +373,8 @@ int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason) s->net = bts->network; /* Indicate "attached to LAC" */ s->lac = bts->location_area_code; + s->mnc = bts->network_code; + s->mcc = bts->country_code; LOGP(DMM, LOGL_INFO, "Subscriber %s ATTACHED LAC=%u\n", subscr_name(s), s->lac); diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c index 8890099c6..a220a31a8 100644 --- a/openbsc/src/libmsc/vty_interface_layer3.c +++ b/openbsc/src/libmsc/vty_interface_layer3.c @@ -381,15 +381,13 @@ DEFUN(subscriber_silent_call_start, type = RSL_CHANNEED_ANY; /* Defaults to ANY */ rc = gsm_silent_call_start(subscr, vty, type); + subscr_put(subscr); if (rc <= 0) { - vty_out(vty, "%% Subscriber not attached%s", - VTY_NEWLINE); - subscr_put(subscr); + vty_out(vty, "%% Subscriber not attached: %d%s", + rc, VTY_NEWLINE); return CMD_WARNING; } - subscr_put(subscr); - return CMD_SUCCESS; } diff --git a/openbsc/src/utils/bs11_config.c b/openbsc/src/utils/bs11_config.c index e8acb461a..65811e9dc 100644 --- a/openbsc/src/utils/bs11_config.c +++ b/openbsc/src/utils/bs11_config.c @@ -893,7 +893,7 @@ int main(int argc, char **argv) handle_options(argc, argv); bts_model_bs11_init(); - gsmnet = gsm_network_init(1, 1, NULL); + gsmnet = gsm_network_init(NULL); if (!gsmnet) { fprintf(stderr, "Unable to allocate gsm network\n"); exit(1); diff --git a/openbsc/tests/channel/channel_test.c b/openbsc/tests/channel/channel_test.c index 9fb1e9e9a..c0a7f7028 100644 --- a/openbsc/tests/channel/channel_test.c +++ b/openbsc/tests/channel/channel_test.c @@ -65,7 +65,7 @@ int main(int argc, char **argv) printf("Testing the gsm_subscriber chan logic\n"); /* Create a dummy network */ - network = gsm_network_init(1, 1, NULL); + network = gsm_network_init(NULL); if (!network) exit(1); bts = gsm_bts_alloc(network); -- cgit v1.2.3