From 5e47b1a1d370c187c776b29c5958f167519e94d7 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Wed, 10 Feb 2016 23:42:17 +0100 Subject: mscplit: try to clarify root talloc ctx and global gsm_network. The aim is to allow osmo-cscn to pass its own root talloc context and global gsm_network struct instance cleanly. This may stir up some old and dusty globals, but I hope it's for the better, since not all is a BSC. To ensure that a global gsm_network pointer for the bsc_vty is set, have it as argument to bsc_vty_init(). The vty configuration commands are added only after bsc_vty_init(), which are needed to configure the network struct. So split up the bsc_bootstrap_network() function into bsc_network_init() to allocate a gsm_struct, and bsc_network_configure() to read the config file once the vty commands are in place. In this way, no global bsc_gsmnet pointer is needed for the bsc vty. The atomic super glue is dissolved and osmo-cscn will be allowed to have a different name for it. Admitted, it's still called the bsc_vty, but a split thereof is probably coming soon, because the CSCN doesn't want any of the BSC nor BTS specific vty commands. --- openbsc/include/openbsc/bss.h | 5 ++++- openbsc/include/openbsc/common.h | 7 +++++++ openbsc/include/openbsc/gsm_data.h | 7 +++++-- openbsc/include/openbsc/vty.h | 4 +++- openbsc/src/ipaccess/ipaccess-config.c | 2 +- openbsc/src/libbsc/abis_nm_vty.c | 4 ++-- openbsc/src/libbsc/abis_om2000_vty.c | 4 ++-- openbsc/src/libbsc/bsc_init.c | 22 ++++++++++----------- openbsc/src/libbsc/bsc_vty.c | 26 +++++++++++++----------- openbsc/src/libbsc/bts_ipaccess_nanobts.c | 1 + openbsc/src/libbsc/net_init.c | 8 +++++--- openbsc/src/libcommon/talloc_ctx.c | 32 +++++++++++++++--------------- openbsc/src/libmsc/vty_interface_layer3.c | 2 -- openbsc/src/osmo-bsc_nat/bsc_nat_vty.c | 2 +- openbsc/src/osmo-nitb/bsc_hack.c | 33 +++++++++++++++++++------------ openbsc/src/utils/bs11_config.c | 2 +- openbsc/tests/channel/channel_test.c | 2 +- 17 files changed, 95 insertions(+), 68 deletions(-) (limited to 'openbsc') diff --git a/openbsc/include/openbsc/bss.h b/openbsc/include/openbsc/bss.h index 49df547a1..8705443e1 100644 --- a/openbsc/include/openbsc/bss.h +++ b/openbsc/include/openbsc/bss.h @@ -1,11 +1,14 @@ #ifndef _BSS_H_ #define _BSS_H_ +#include + struct gsm_network; struct msgb; /* start and stop network */ -extern int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), const char *cfg_file); +extern int bsc_network_init(mncc_recv_cb_t mncc_recv); +extern int bsc_network_configure(const char *cfg_file); extern int bsc_shutdown_net(struct gsm_network *net); /* register all supported BTS */ diff --git a/openbsc/include/openbsc/common.h b/openbsc/include/openbsc/common.h index 3d7de115e..2a396f3db 100644 --- a/openbsc/include/openbsc/common.h +++ b/openbsc/include/openbsc/common.h @@ -1,5 +1,12 @@ #pragma once +#include + +struct msgb; +struct gsm_network; + +typedef int (*mncc_recv_cb_t)(struct gsm_network *, struct msgb *); + #define MAX_A5_KEY_LEN (128/8) struct gsm_encr { diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 58647998b..708c87cb9 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -382,8 +382,11 @@ 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(void *ctx, + uint16_t country_code, + uint16_t network_code, + mncc_recv_cb_t mncc_recv); + int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type); enum gsm_bts_type parse_btstype(const char *arg); diff --git a/openbsc/include/openbsc/vty.h b/openbsc/include/openbsc/vty.h index bc30e2357..315db0d11 100644 --- a/openbsc/include/openbsc/vty.h +++ b/openbsc/include/openbsc/vty.h @@ -43,7 +43,9 @@ extern int bsc_vty_is_config_node(struct vty *vty, int node); extern void bsc_replace_string(void *ctx, char **dst, const char *newstr); struct log_info; -int bsc_vty_init(const struct log_info *cat); +int bsc_vty_init(const struct log_info *cat, struct gsm_network *network); int bsc_vty_init_extra(void); +struct gsm_network *gsmnet_from_vty(struct vty *vty); + #endif diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c index 31da05636..9e3a4712e 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(tall_bsc_ctx, 1, 1, NULL); if (!bsc_gsmnet) exit(1); diff --git a/openbsc/src/libbsc/abis_nm_vty.c b/openbsc/src/libbsc/abis_nm_vty.c index a14e5c2f4..6ec0a4a21 100644 --- a/openbsc/src/libbsc/abis_nm_vty.c +++ b/openbsc/src/libbsc/abis_nm_vty.c @@ -94,7 +94,7 @@ DEFUN(oml_class_inst, oml_class_inst_cmd, struct oml_node_state *oms; int bts_nr = atoi(argv[0]); - bts = gsm_bts_num(bsc_gsmnet, bts_nr); + bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; @@ -128,7 +128,7 @@ DEFUN(oml_classnum_inst, oml_classnum_inst_cmd, struct oml_node_state *oms; int bts_nr = atoi(argv[0]); - bts = gsm_bts_num(bsc_gsmnet, bts_nr); + bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; diff --git a/openbsc/src/libbsc/abis_om2000_vty.c b/openbsc/src/libbsc/abis_om2000_vty.c index 8325e29a7..72422a1d5 100644 --- a/openbsc/src/libbsc/abis_om2000_vty.c +++ b/openbsc/src/libbsc/abis_om2000_vty.c @@ -82,7 +82,7 @@ DEFUN(om2k_class_inst, om2k_class_inst_cmd, struct oml_node_state *oms; int bts_nr = atoi(argv[0]); - bts = gsm_bts_num(bsc_gsmnet, bts_nr); + bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; @@ -122,7 +122,7 @@ DEFUN(om2k_classnum_inst, om2k_classnum_inst_cmd, struct oml_node_state *oms; int bts_nr = atoi(argv[0]); - bts = gsm_bts_num(bsc_gsmnet, bts_nr); + bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 859d9998f..3ec3aa837 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -472,24 +472,24 @@ static int bootstrap_bts(struct gsm_bts *bts) return 0; } -int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), - const char *config_file) +int bsc_network_init(mncc_recv_cb_t mncc_recv) { - struct telnet_connection dummy_conn; - struct gsm_bts *bts; - int rc; - - /* initialize our data structures */ - bsc_gsmnet = gsm_network_init(1, 1, mncc_recv); + bsc_gsmnet = gsm_network_init(tall_bsc_ctx, 1, 1, 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; - rc = vty_read_config_file(config_file, &dummy_conn); + return 0; +} + +int bsc_network_configure(const char *config_file) +{ + struct gsm_bts *bts; + int rc; + + rc = vty_read_config_file(config_file, NULL); if (rc < 0) { LOGP(DNM, LOGL_FATAL, "Failed to parse the config file: '%s'\n", config_file); return rc; diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index 418e43549..29de16ca0 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -130,19 +130,21 @@ struct cmd_node ts_node = { 1, }; -extern struct gsm_network *bsc_gsmnet; +static struct gsm_network *vty_global_gsm_network = 0; struct gsm_network *gsmnet_from_vty(struct vty *v) { /* In case we read from the config file, the vty->priv cannot * point to a struct telnet_connection, and thus conn->priv - * will not point to the gsm_network structure */ -#if 0 - struct telnet_connection *conn = v->priv; - return (struct gsm_network *) conn->priv; -#else - return bsc_gsmnet; -#endif + * will not point to the gsm_network structure. + * It can't hurt to force callers to continue to pass the vty instance + * to this function, in case we'd like to retrieve the global + * gsm_network instance from the vty at some point in the future. But + * until then, just return the global pointer, which should have been + * initialized by bsc_vty_init(). + */ + OSMO_ASSERT(vty_global_gsm_network); + return vty_global_gsm_network; } static int dummy_config_write(struct vty *v) @@ -3620,7 +3622,7 @@ DEFUN(smscb_cmd, smscb_cmd_cmd, uint8_t buf[88]; int rc; - bts = gsm_bts_num(bsc_gsmnet, bts_nr); + bts = gsm_bts_num(vty_global_gsm_network, bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; @@ -3671,7 +3673,7 @@ DEFUN(pdch_act, pdch_act_cmd, int ts_nr = atoi(argv[2]); int activate; - bts = gsm_bts_num(bsc_gsmnet, bts_nr); + bts = gsm_bts_num(vty_global_gsm_network, bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; @@ -3710,8 +3712,10 @@ DEFUN(pdch_act, pdch_act_cmd, extern int bsc_vty_init_extra(void); extern const char *openbsc_copyright; -int bsc_vty_init(const struct log_info *cat) +int bsc_vty_init(const struct log_info *cat, struct gsm_network *network) { + vty_global_gsm_network = network; + cfg_ts_pchan_cmd.string = vty_cmd_string_from_valstr(tall_bsc_ctx, gsm_pchant_names, diff --git a/openbsc/src/libbsc/bts_ipaccess_nanobts.c b/openbsc/src/libbsc/bts_ipaccess_nanobts.c index dfb5a45bc..ee356b82c 100644 --- a/openbsc/src/libbsc/bts_ipaccess_nanobts.c +++ b/openbsc/src/libbsc/bts_ipaccess_nanobts.c @@ -39,6 +39,7 @@ #include #include #include +#include extern struct gsm_network *bsc_gsmnet; diff --git a/openbsc/src/libbsc/net_init.c b/openbsc/src/libbsc/net_init.c index 3b5f4f906..9aba4a0b7 100644 --- a/openbsc/src/libbsc/net_init.c +++ b/openbsc/src/libbsc/net_init.c @@ -21,12 +21,14 @@ #include #include -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(void *ctx, + uint16_t country_code, + uint16_t network_code, + mncc_recv_cb_t mncc_recv) { struct gsm_network *net; - net = talloc_zero(tall_bsc_ctx, struct gsm_network); + net = talloc_zero(ctx, struct gsm_network); if (!net) return NULL; diff --git a/openbsc/src/libcommon/talloc_ctx.c b/openbsc/src/libcommon/talloc_ctx.c index ae6a15636..c26b50f98 100644 --- a/openbsc/src/libcommon/talloc_ctx.c +++ b/openbsc/src/libcommon/talloc_ctx.c @@ -17,22 +17,22 @@ extern void *tall_map_ctx; extern void *tall_upq_ctx; extern void *tall_ctr_ctx; -void talloc_ctx_init(void) +void talloc_ctx_init(void *ctx_root) { - tall_msgb_ctx = talloc_named_const(tall_bsc_ctx, 0, "msgb"); - tall_fle_ctx = talloc_named_const(tall_bsc_ctx, 0, + tall_msgb_ctx = talloc_named_const(ctx_root, 0, "msgb"); + tall_fle_ctx = talloc_named_const(ctx_root, 0, "bs11_file_list_entry"); - tall_locop_ctx = talloc_named_const(tall_bsc_ctx, 0, "loc_updating_oper"); - tall_authciphop_ctx = talloc_named_const(tall_bsc_ctx, 0, "auth_ciph_oper"); - tall_gsms_ctx = talloc_named_const(tall_bsc_ctx, 0, "sms"); - tall_subscr_ctx = talloc_named_const(tall_bsc_ctx, 0, "subscriber"); - tall_sub_req_ctx = talloc_named_const(tall_bsc_ctx, 0, "subscr_request"); - tall_call_ctx = talloc_named_const(tall_bsc_ctx, 0, "gsm_call"); - tall_paging_ctx = talloc_named_const(tall_bsc_ctx, 0, "paging_request"); - tall_sigh_ctx = talloc_named_const(tall_bsc_ctx, 0, "signal_handler"); - tall_tqe_ctx = talloc_named_const(tall_bsc_ctx, 0, "subch_txq_entry"); - tall_trans_ctx = talloc_named_const(tall_bsc_ctx, 0, "transaction"); - tall_map_ctx = talloc_named_const(tall_bsc_ctx, 0, "trau_map_entry"); - tall_upq_ctx = talloc_named_const(tall_bsc_ctx, 0, "trau_upq_entry"); - tall_ctr_ctx = talloc_named_const(tall_bsc_ctx, 0, "counter"); + tall_locop_ctx = talloc_named_const(ctx_root, 0, "loc_updating_oper"); + tall_authciphop_ctx = talloc_named_const(ctx_root, 0, "auth_ciph_oper"); + tall_gsms_ctx = talloc_named_const(ctx_root, 0, "sms"); + tall_subscr_ctx = talloc_named_const(ctx_root, 0, "subscriber"); + tall_sub_req_ctx = talloc_named_const(ctx_root, 0, "subscr_request"); + tall_call_ctx = talloc_named_const(ctx_root, 0, "gsm_call"); + tall_paging_ctx = talloc_named_const(ctx_root, 0, "paging_request"); + tall_sigh_ctx = talloc_named_const(ctx_root, 0, "signal_handler"); + tall_tqe_ctx = talloc_named_const(ctx_root, 0, "subch_txq_entry"); + tall_trans_ctx = talloc_named_const(ctx_root, 0, "transaction"); + tall_map_ctx = talloc_named_const(ctx_root, 0, "trau_map_entry"); + tall_upq_ctx = talloc_named_const(ctx_root, 0, "trau_upq_entry"); + tall_ctr_ctx = talloc_named_const(ctx_root, 0, "counter"); } diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c index 966c920cc..0aa212a4e 100644 --- a/openbsc/src/libmsc/vty_interface_layer3.c +++ b/openbsc/src/libmsc/vty_interface_layer3.c @@ -53,8 +53,6 @@ #include "meas_feed.h" -extern struct gsm_network *gsmnet_from_vty(struct vty *v); - static void subscr_dump_full_vty(struct vty *vty, struct gsm_subscriber *subscr) { int rc; diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c index cd8293cc9..ce68742fa 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c @@ -1257,7 +1257,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat) /* called by the telnet interface... we have our own init above */ -int bsc_vty_init(const struct log_info *cat) +int bsc_vty_init(const struct log_info *cat, struct gsm_network *network) { logging_vty_add_cmds(cat); return 0; diff --git a/openbsc/src/osmo-nitb/bsc_hack.c b/openbsc/src/osmo-nitb/bsc_hack.c index dffe642b8..2be03ec66 100644 --- a/openbsc/src/osmo-nitb/bsc_hack.c +++ b/openbsc/src/osmo-nitb/bsc_hack.c @@ -242,7 +242,7 @@ static void subscr_expire_cb(void *data) osmo_timer_schedule(&bsc_gsmnet->subscr_expire_timer, EXPIRE_INTERVAL); } -void talloc_ctx_init(void); +void talloc_ctx_init(void *ctx_root); extern int bsc_vty_go_parent(struct vty *vty); @@ -260,7 +260,7 @@ int main(int argc, char **argv) vty_info.copyright = openbsc_copyright; tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc"); - talloc_ctx_init(); + talloc_ctx_init(tall_bsc_ctx); on_dso_load_token(); on_dso_load_rrlp(); on_dso_load_ho_dec(); @@ -270,9 +270,18 @@ int main(int argc, char **argv) osmo_stats_init(tall_bsc_ctx); bts_init(); + handle_options(argc, argv); + + /* internal MNCC handler or MNCC socket? */ + rc = bsc_network_init(mncc_sock_path? + mncc_sock_from_cc : int_mncc_recv); + if (rc < 0) + exit(1); + /* This needs to precede handle_options() */ + /* no it doesn't, does it. */ vty_init(&vty_info); - bsc_vty_init(&log_info); + bsc_vty_init(&log_info, bsc_gsmnet); ctrl_vty_init(tall_bsc_ctx); #ifdef BUILD_SMPP @@ -280,18 +289,16 @@ int main(int argc, char **argv) return -1; #endif - /* parse options */ - handle_options(argc, argv); - - /* internal MNCC handler or MNCC socket? */ - if (mncc_sock_path) { - rc = bsc_bootstrap_network(mncc_sock_from_cc, config_file); - if (rc >= 0) - mncc_sock_init(bsc_gsmnet, mncc_sock_path); - } else - rc = bsc_bootstrap_network(int_mncc_recv, config_file); + rc = bsc_network_configure(config_file); if (rc < 0) exit(1); + + if (mncc_sock_path) { + rc = mncc_sock_init(bsc_gsmnet, mncc_sock_path); + if (rc < 0) + exit(1); + } + #ifdef BUILD_SMPP smpp_openbsc_start(bsc_gsmnet); #endif diff --git a/openbsc/src/utils/bs11_config.c b/openbsc/src/utils/bs11_config.c index 0d13e25c5..8baa7faa0 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(tall_bsc_ctx, 1, 1, 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 567460722..924d763ff 100644 --- a/openbsc/tests/channel/channel_test.c +++ b/openbsc/tests/channel/channel_test.c @@ -68,7 +68,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(tall_bsc_ctx, 1, 1, NULL); if (!network) exit(1); bts = gsm_bts_alloc(network); -- cgit v1.2.3