From 8254cf75bf818e715201c670c7fb81b9a23dec0b Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 29 May 2017 13:42:19 +0200 Subject: [PATCH] libbsc: Create pcu-socket only as specified in config file Since commit b4999b60d48bcbb5aa575973d068e07ab672e095 we created PCU sockets at hard-coded paths in the filesystem by default for all BTSs. This is inflexible and prevents the use of multiple BSC instances on a single filesystem, or the placement of the sockets in a more secure location than /tmp. The new approach with this patch is that * no PCU sockets are created by default * only for those BTSs where a 'pcu-socket' is configured via VTY, the socket will actually be created Change-Id: Ie9079470584777dcc31f85f9bf0808f479156ccb Closes: OS#2293 --- openbsc/include/openbsc/gsm_data_shared.h | 1 + openbsc/include/openbsc/pcu_if.h | 2 -- openbsc/src/libbsc/bsc_init.c | 14 ------------ openbsc/src/libbsc/bsc_vty.c | 26 +++++++++++++++++++++++ 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/openbsc/include/openbsc/gsm_data_shared.h b/openbsc/include/openbsc/gsm_data_shared.h index 3371fb927..1380a6cba 100644 --- a/openbsc/include/openbsc/gsm_data_shared.h +++ b/openbsc/include/openbsc/gsm_data_shared.h @@ -870,6 +870,7 @@ struct gsm_bts { struct amr_multirate_conf mr_half; /* PCU socket state */ + char *pcu_sock_path; struct pcu_sock_state *pcu_state; #endif /* ROLE_BSC */ diff --git a/openbsc/include/openbsc/pcu_if.h b/openbsc/include/openbsc/pcu_if.h index 0c355b7a6..1f398b4aa 100644 --- a/openbsc/include/openbsc/pcu_if.h +++ b/openbsc/include/openbsc/pcu_if.h @@ -1,8 +1,6 @@ #ifndef _PCU_IF_H #define _PCU_IF_H -#define PCU_SOCK_DEFAULT "/tmp/pcu_bts" - #include extern int pcu_direct; diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 520b2e24e..caec8005d 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -507,8 +507,6 @@ int bsc_network_configure(const char *config_file) { struct gsm_bts *bts; int rc; - char pcu_sock_path[PATH_MAX]; - char pcu_sock_path_ending[PATH_MAX]; rc = vty_read_config_file(config_file, NULL); if (rc < 0) { @@ -536,18 +534,6 @@ int bsc_network_configure(const char *config_file) LOGP(DNM, LOGL_FATAL, "Error enabling E1 input driver\n"); return rc; } - - strcpy(pcu_sock_path, PCU_SOCK_DEFAULT); - sprintf(pcu_sock_path_ending,"_%i", bts->nr); - if (bts->nr > 0) - strcat(pcu_sock_path, pcu_sock_path_ending); - rc = pcu_sock_init(pcu_sock_path, bts); - - if (rc < 0) { - LOGP(DNM, LOGL_FATAL, - "PCU L1 socket failed for bts %i\n", bts->nr); - return rc; - } } return 0; diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index f14a20568..f17bde604 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -53,6 +53,7 @@ #include #include #include +#include #include @@ -280,6 +281,8 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts) vty_out(vty, "Early Classmark Sending: %s%s", bts->early_classmark_allowed ? "allowed" : "forbidden", VTY_NEWLINE); + if (bts->pcu_sock_path) + vty_out(vty, "PCU Socket Path: %s%s", bts->pcu_sock_path, VTY_NEWLINE); if (is_ipaccess_bts(bts)) vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s", bts->ip_access.site_id, bts->ip_access.bts_id, @@ -764,6 +767,8 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts) vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE); } } + if (bts->pcu_sock_path) + vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE); config_write_bts_model(vty, bts); } @@ -2933,6 +2938,26 @@ DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd, return CMD_SUCCESS; } +DEFUN(cfg_bts_pcu_sock, cfg_bts_pcu_sock_cmd, + "pcu-socket PATH", + "PCU Socket Path for using OsmoPCU co-located with BSC (legacy BTS)\n" + "Path in the file system for the unix-domain PCU socket\n") +{ + struct gsm_bts *bts = vty->index; + int rc; + + bsc_replace_string(bts, &bts->pcu_sock_path, argv[0]); + pcu_sock_exit(bts); + rc = pcu_sock_init(bts->pcu_sock_path, bts); + if (rc < 0) { + vty_out(vty, "%% Error creating PCU socket `%s' for BTS %u%s", + bts->pcu_sock_path, bts->nr, VTY_NEWLINE); + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + #define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n" DEFUN(cfg_bts_excl_rf_lock, @@ -4231,6 +4256,7 @@ int bsc_vty_init(struct gsm_network *network) install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd); install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd); install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd); + install_element(BTS_NODE, &cfg_bts_pcu_sock_cmd); install_element(BTS_NODE, &cfg_trx_cmd); install_node(&trx_node, dummy_config_write);