/* VTY interface for A-bis OML (Netowrk Management) */ /* (C) 2009-2010 by Harald Welte * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern struct gsm_network *bsc_gsmnet; static struct cmd_node oml_node = { OML_NODE, "%s(oml)# ", 1, }; struct oml_node_state { struct gsm_bts *bts; uint8_t obj_class; uint8_t obj_inst[3]; }; static int dummy_config_write(struct vty *v) { return CMD_SUCCESS; } /* FIXME: auto-generate those strings from the value_string lists */ #define NM_OBJCLASS_VTY "(site-manager|bts|radio-carrier|baseband-transceiver|channel|adjc|handover|power-contorl|btse|rack|test|envabtse|bport|gprs-nse|gprs-cell|gprs-nsvc|siemenshw)" #define NM_OBJCLASS_VTY_HELP "FIXME" DEFUN(oml_class_inst, oml_class_inst_cmd, "bts <0-255> oml class " NM_OBJCLASS_VTY " instance <0-255> <0-255> <0-255>", "BTS related commands\n" "BTS Number\n" "Manipulate the OML managed objects\n" "Object Class\n" NM_OBJCLASS_VTY_HELP "Object Instance\n" "BTS Number\n" "TRX Number\n" "TS Number\n") { struct gsm_bts *bts; struct oml_node_state *oms; int bts_nr = atoi(argv[0]); bts = gsm_bts_num(bsc_gsmnet, bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; } oms = talloc_zero(tall_bsc_ctx, struct oml_node_state); if (!oms) return CMD_WARNING; oms->bts = bts; oms->obj_class = get_string_value(abis_nm_obj_class_names, argv[1]); oms->obj_inst[0] = atoi(argv[2]); oms->obj_inst[1] = atoi(argv[3]); oms->obj_inst[2] = atoi(argv[4]); vty->index = oms; vty->node = OML_NODE; return CMD_SUCCESS; } DEFUN(oml_classnum_inst, oml_classnum_inst_cmd, "bts <0-255> oml class <0-255> instance <0-255> <0-255> <0-255>", "BTS related commands\n" "BTS Number\n" "Manipulate the OML managed objects\n" "Object Class\n" "Object Class\n" "Object Instance\n" "BTS Number\n" "TRX Number\n" "TS Number\n") { struct gsm_bts *bts; struct oml_node_state *oms; int bts_nr = atoi(argv[0]); bts = gsm_bts_num(bsc_gsmnet, bts_nr); if (!bts) { vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE); return CMD_WARNING; } oms = talloc_zero(tall_bsc_ctx, struct oml_node_state); if (!oms) return CMD_WARNING; oms->bts = bts; oms->obj_class = atoi(argv[1]); oms->obj_inst[0] = atoi(argv[2]); oms->obj_inst[1] = atoi(argv[3]); oms->obj_inst[2] = atoi(argv[4]); vty->index = oms; vty->node = OML_NODE; return CMD_SUCCESS; } DEFUN(oml_attrib_get, oml_attrib_get_cmd, "attribute get <0-255>", "OML Attribute Actions\n" "Get a single OML Attribute\n" "OML Attribute Number\n") { struct oml_node_state *oms = vty->index; /* FIXME */ return CMD_SUCCESS; } DEFUN(oml_attrib_set, oml_attrib_set_cmd, "attribute set <0-255> .HEX", "OML Attribute Actions\n" "Set a single OML Attribute\n" "OML Attribute Number\n") { struct oml_node_state *oms = vty->index; /* FIXME */ return CMD_SUCCESS; } DEFUN(oml_chg_adm_state, oml_chg_adm_state_cmd, "change-adm-state (locked|unlocked|shutdown|null)", "Change the Administrative State\n" "Locked\n" "Unlocked\n" "Shutdown\n" "NULL\n") { struct oml_node_state *oms = vty->index; enum abis_nm_adm_state state; state = get_string_value(abis_nm_adm_state_names, argv[0]); abis_nm_chg_adm_state(oms->bts, oms->obj_class, oms->obj_inst[0], oms->obj_inst[1], oms->obj_inst[2], state); return CMD_SUCCESS; } DEFUN(oml_opstart, oml_opstart_cmd, "opstart", "Send an OPSTART message to the object") { struct oml_node_state *oms = vty->index; abis_nm_opstart(oms->bts, oms->obj_class, oms->obj_inst[0], oms->obj_inst[1], oms->obj_inst[2]); return CMD_SUCCESS; } int abis_nm_vty_init(void) { install_element(ENABLE_NODE, &oml_class_inst_cmd); install_element(ENABLE_NODE, &oml_classnum_inst_cmd); install_node(&oml_node, dummy_config_write); install_default(OML_NODE); install_element(OML_NODE, &ournode_exit_cmd); install_element(OML_NODE, &oml_attrib_get_cmd); install_element(OML_NODE, &oml_attrib_set_cmd); install_element(OML_NODE, &oml_chg_adm_state_cmd); install_element(OML_NODE, &oml_opstart_cmd); return 0; }