aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-02-10 23:42:17 +0100
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-03-03 16:19:09 +0100
commit5e47b1a1d370c187c776b29c5958f167519e94d7 (patch)
tree109151df31be3ebfb242d3345f82a0475b44a4cc
parentb9e5403ef46171f58390757d002a756bd9d2d202 (diff)
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.
-rw-r--r--openbsc/include/openbsc/bss.h5
-rw-r--r--openbsc/include/openbsc/common.h7
-rw-r--r--openbsc/include/openbsc/gsm_data.h7
-rw-r--r--openbsc/include/openbsc/vty.h4
-rw-r--r--openbsc/src/ipaccess/ipaccess-config.c2
-rw-r--r--openbsc/src/libbsc/abis_nm_vty.c4
-rw-r--r--openbsc/src/libbsc/abis_om2000_vty.c4
-rw-r--r--openbsc/src/libbsc/bsc_init.c22
-rw-r--r--openbsc/src/libbsc/bsc_vty.c26
-rw-r--r--openbsc/src/libbsc/bts_ipaccess_nanobts.c1
-rw-r--r--openbsc/src/libbsc/net_init.c8
-rw-r--r--openbsc/src/libcommon/talloc_ctx.c32
-rw-r--r--openbsc/src/libmsc/vty_interface_layer3.c2
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_vty.c2
-rw-r--r--openbsc/src/osmo-nitb/bsc_hack.c33
-rw-r--r--openbsc/src/utils/bs11_config.c2
-rw-r--r--openbsc/tests/channel/channel_test.c2
17 files changed, 95 insertions, 68 deletions
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 <openbsc/common.h>
+
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 <stdint.h>
+
+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 <osmocom/abis/ipaccess.h>
#include <osmocom/core/logging.h>
#include <openbsc/ipaccess.h>
+#include <openbsc/vty.h>
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 <openbsc/osmo_msc_data.h>
#include <openbsc/gsm_subscriber.h>
-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);