aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2013-02-22 13:25:09 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2013-04-22 09:09:32 +0200
commite2b8ff41c5cd603bdf9f490a6a59c695fe75f38e (patch)
tree9df8fa9e8dcb47f4001b24e2c56152557c30a8e0
parent297d6a36fe7f126c32166394556d48bb966a9bd6 (diff)
nitb: Add ctrl command to set the BTS neighbor mode
-rw-r--r--openbsc/include/openbsc/gsm_data.h5
-rw-r--r--openbsc/src/libbsc/bsc_vty.c27
-rw-r--r--openbsc/src/libcommon/gsm_data.c34
-rw-r--r--openbsc/src/osmo-nitb/ctrl_commands.c28
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;
}