aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2013-02-22 13:25:09 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-03-06 23:05:12 +0100
commitdb6f5a26bb8ab3a20f5066cd66d1f616ea215ffe (patch)
tree4a57823ff3d4e826a18149197ff54ee5b8cecf67 /openbsc/src/libbsc
parenta58d0818b20575efef6d5e439fb824765dcee67d (diff)
nitb: Add ctrl command to set the BTS neighbor mode
Diffstat (limited to 'openbsc/src/libbsc')
-rw-r--r--openbsc/src/libbsc/bsc_ctrl_commands.c29
-rw-r--r--openbsc/src/libbsc/bsc_vty.c27
2 files changed, 32 insertions, 24 deletions
diff --git a/openbsc/src/libbsc/bsc_ctrl_commands.c b/openbsc/src/libbsc/bsc_ctrl_commands.c
index 5dcdfdf14..ff0a9dfc3 100644
--- a/openbsc/src/libbsc/bsc_ctrl_commands.c
+++ b/openbsc/src/libbsc/bsc_ctrl_commands.c
@@ -209,6 +209,34 @@ CTRL_CMD_DEFINE_RANGE(bts_ci, "cell-identity", struct gsm_bts,
CTRL_CMD_DEFINE_RANGE(bts_ms_max_power, "ms-max-power", struct gsm_bts,
ms_max_power, 0, 40);
+static int verify_bts_neighbor_mode(struct ctrl_cmd *cmd, const char *v, void *d)
+{
+ if (bts_neigh_mode_value(v) >= 0)
+ return 0;
+ cmd->reply = "Illegal neighbor mode";
+ return -1;
+}
+
+static int get_bts_neighbor_mode(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts *bts = cmd->node;
+ cmd->reply = talloc_strdup(cmd, bts_neigh_mode_string(bts->neigh_list_manual_mode));
+ return CTRL_CMD_REPLY;
+}
+
+static int set_bts_neighbor_mode(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts *bts = cmd->node;
+ enum neigh_list_manual_mode mode;
+
+ mode = bts_neigh_mode_value(cmd->value);
+ bts_set_neigh_mode(bts, mode);
+
+ return get_bts_neighbor_mode(cmd, data);
+}
+CTRL_CMD_DEFINE(bts_neighbor_mode, "neighbor-mode");
+
+
int bsc_base_ctrl_cmds_install(void)
{
int rc = 0;
@@ -237,6 +265,7 @@ int bsc_base_ctrl_cmds_install(void)
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_lac);
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_ci);
rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_ms_max_power);
+ rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_neighbor_mode);
return rc;
}
diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c
index 75297cb2b..969094b52 100644
--- a/openbsc/src/libbsc/bsc_vty.c
+++ b/openbsc/src/libbsc/bsc_vty.c
@@ -92,13 +92,6 @@ static const struct value_string gprs_bssgp_cfg_strs[] = {
{ 0, NULL }
};
-static const struct value_string bts_neigh_mode_strs[] = {
- { NL_MODE_AUTOMATIC, "automatic" },
- { NL_MODE_MANUAL, "manual" },
- { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
- { 0, NULL }
-};
-
const struct value_string bts_loc_fix_names[] = {
{ BTS_LOC_FIX_INVALID, "invalid" },
{ BTS_LOC_FIX_2D, "fix2d" },
@@ -629,7 +622,7 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
vty_out(vty, " neighbor-list mode %s%s",
- get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
+ bts_neigh_mode_string(bts->neigh_list_manual_mode), VTY_NEWLINE);
if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
for (i = 0; i < 1024; i++) {
if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
@@ -2630,23 +2623,9 @@ DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
"Manual with different lists for SI2 and SI5\n")
{
struct gsm_bts *bts = vty->index;
- int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
-
- switch (mode) {
- case NL_MODE_MANUAL_SI5SEP:
- case NL_MODE_MANUAL:
- /* make sure we clear the current list when switching to
- * manual mode */
- if (bts->neigh_list_manual_mode == 0)
- memset(&bts->si_common.data.neigh_list, 0,
- sizeof(bts->si_common.data.neigh_list));
- break;
- default:
- break;
- }
-
- bts->neigh_list_manual_mode = mode;
+ int mode = bts_neigh_mode_value(argv[0]);
+ bts_set_neigh_mode(bts, mode);
return CMD_SUCCESS;
}