diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-02-22 13:25:09 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2014-03-06 23:05:12 +0100 |
commit | db6f5a26bb8ab3a20f5066cd66d1f616ea215ffe (patch) | |
tree | 4a57823ff3d4e826a18149197ff54ee5b8cecf67 | |
parent | a58d0818b20575efef6d5e439fb824765dcee67d (diff) |
nitb: Add ctrl command to set the BTS neighbor mode
-rw-r--r-- | openbsc/include/openbsc/gsm_data.h | 5 | ||||
-rw-r--r-- | openbsc/src/libbsc/bsc_ctrl_commands.c | 29 | ||||
-rw-r--r-- | openbsc/src/libbsc/bsc_vty.c | 27 | ||||
-rw-r--r-- | openbsc/src/libcommon/gsm_data.c | 34 |
4 files changed, 71 insertions, 24 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 1b4720fe0..30e8dbdc5 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -436,4 +436,9 @@ extern const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1]; /* control interface handling */ int bsc_base_ctrl_cmds_install(void); +/* neighbor list helpers */ +const char *bts_neigh_mode_string(enum neigh_list_manual_mode mode); +int bts_neigh_mode_value(const char *string); +void bts_set_neigh_mode(struct gsm_bts *bts, int mode); + #endif /* _GSM_DATA_H */ 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; } diff --git a/openbsc/src/libcommon/gsm_data.c b/openbsc/src/libcommon/gsm_data.c index 45abc271d..5a7321579 100644 --- a/openbsc/src/libcommon/gsm_data.c +++ b/openbsc/src/libcommon/gsm_data.c @@ -468,3 +468,37 @@ int gsm_parse_reg(void *ctx, regex_t *reg, char **str, int argc, const char **ar return ret; } +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 char *bts_neigh_mode_string(enum neigh_list_manual_mode mode) +{ + return get_value_string(bts_neigh_mode_strs, mode); +} + +int bts_neigh_mode_value(const char *string) +{ + return get_string_value(bts_neigh_mode_strs, string); +} + +void bts_set_neigh_mode(struct gsm_bts *bts, int mode) +{ + 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; +} |