diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-02-22 13:25:09 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-04-22 09:09:32 +0200 |
commit | e2b8ff41c5cd603bdf9f490a6a59c695fe75f38e (patch) | |
tree | 9df8fa9e8dcb47f4001b24e2c56152557c30a8e0 | |
parent | 297d6a36fe7f126c32166394556d48bb966a9bd6 (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_vty.c | 27 | ||||
-rw-r--r-- | openbsc/src/libcommon/gsm_data.c | 34 | ||||
-rw-r--r-- | openbsc/src/osmo-nitb/ctrl_commands.c | 28 |
4 files changed, 70 insertions, 24 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index a4c6fbc68..12b908b04 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -398,4 +398,9 @@ extern struct e1inp_line_ops bts_isdn_e1inp_line_ops; extern const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE+1]; extern const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1]; +/* 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_vty.c b/openbsc/src/libbsc/bsc_vty.c index c1055d941..54adf3e0a 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -88,13 +88,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" }, @@ -582,7 +575,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)) @@ -2469,23 +2462,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 d88e0aa70..5722b396c 100644 --- a/openbsc/src/libcommon/gsm_data.c +++ b/openbsc/src/libcommon/gsm_data.c @@ -472,3 +472,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; +} diff --git a/openbsc/src/osmo-nitb/ctrl_commands.c b/openbsc/src/osmo-nitb/ctrl_commands.c index 388bb0492..7ce77e4be 100644 --- a/openbsc/src/osmo-nitb/ctrl_commands.c +++ b/openbsc/src/osmo-nitb/ctrl_commands.c @@ -151,6 +151,33 @@ 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_ctrl_cmds_install(void) { @@ -179,6 +206,7 @@ int bsc_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; } |