diff options
Diffstat (limited to 'lib/command_common.h')
-rw-r--r-- | lib/command_common.h | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/lib/command_common.h b/lib/command_common.h new file mode 100644 index 00000000..4dd26753 --- /dev/null +++ b/lib/command_common.h @@ -0,0 +1,290 @@ +/* Command handler node_type stuff -- header + * Copyright (C) 1997, 98 Kunihiro Ishiguro + * + * This file is part of GNU Zebra. + * + * GNU Zebra 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, or (at your + * option) any later version. + * + * GNU Zebra 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 GNU Zebra; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _ZEBRA_COMMAND_COMMON_H +#define _ZEBRA_COMMAND_COMMON_H + +#include "misc.h" +#include "vector.h" + +/*------------------------------------------------------------------------------ + * These are the command levels/contexts. + * + * NB: this is the order in which configuration is written to the + * configuration file. + */ +enum node_type +{ + NULL_NODE = 0, /* For when need "not a node" */ + + AUTH_NODE, /* VTY login -> VIEW_NODE */ + RESTRICTED_NODE, /* if no login required, may use this node */ + VIEW_NODE, /* aka user EXEC */ + AUTH_ENABLE_NODE, /* enable login -> ENABLE_NODE/CONFIG_NODE */ + ENABLE_NODE, /* aka privileged EXEC */ + + MIN_DO_SHORTCUT_NODE = ENABLE_NODE, + /* May not "do xx" at any node lower */ + MAX_NON_CONFIG_NODE = ENABLE_NODE, + /* May not be higher than this without owning + * the configuration symbol of power */ + + CONFIG_NODE, /* aka global configuration mode */ + + MIN_CONFIG_NODE = CONFIG_NODE, + /* May not change context to any node lower */ + + SERVICE_NODE, /* unused ! */ + DEBUG_NODE, /* debug config write only */ + AAA_NODE, /* unused ! */ + KEYCHAIN_NODE, /* see: keychain.c */ + KEYCHAIN_KEY_NODE, /* see: keychain.c -- child of KEYCHAIN_NODE */ + INTERFACE_NODE, /* interface commands */ + ZEBRA_NODE, /* router zebra commands */ + TABLE_NODE, /* rtm_table config write -- see zserv.c */ + RIP_NODE, /* router rip commands */ + RIPNG_NODE, /* router ripng commands */ + BGP_NODE, /* router bgp commands */ + BGP_VPNV4_NODE, /* address-family vpnv4 -- child of BGP_NODE */ + BGP_IPV4_NODE, /* address-family ipv4 (unicast) -- child of BGP_NODE */ + BGP_IPV4M_NODE, /* address-family ipv4 multicast -- child of BGP_NODE */ + BGP_IPV6_NODE, /* address-family ipv6 (unicast) -- child of BGP_NODE */ + BGP_IPV6M_NODE, /* address-family ipv6 multicast -- child of BGP_NODE */ + OSPF_NODE, /* router ospf commands */ + OSPF6_NODE, /* router ospf6 commands */ + ISIS_NODE, /* router isis commands */ + MASC_NODE, /* unused ! RFC 2909 Multicast Address-Set Claim */ + IRDP_NODE, /* unused ! ICMP Router Discovery Protocol */ + IP_NODE, /* zebra_ip_config write only -- see zebra_vty.c */ + ACCESS_NODE, /* access list config write only -- see filter.c */ + PREFIX_NODE, /* prefix list config write only -- see plist.c */ + ACCESS_IPV6_NODE, /* access list config write only -- see filter.c */ + PREFIX_IPV6_NODE, /* prefix list config write only -- see plist.c */ + AS_LIST_NODE, /* AS list config write only -- see bgp_filter.c */ + COMMUNITY_LIST_NODE, /* Community list config write only -- see bgp_vty.c */ + RMAP_NODE, /* route-map commands */ + SMUX_NODE, /* SNMP config write only -- see smux.c */ + DUMP_NODE, /* BGP dump config write only -- see bgp_dump.c */ + FORWARDING_NODE, /* forwarding config write -- see zserv.c */ + PROTOCOL_NODE, /* protocol config write -- see zebra_vty.c */ + VTY_NODE, /* line vty commands */ + + MAX_PLUS_1_NODE, + MAX_NODE = MAX_PLUS_1_NODE - 1 +} ; +typedef enum node_type node_type_t ; + +/*------------------------------------------------------------------------------ + * Return values for command handling. + * + * NB: when a command is executed it may return CMD_SUCCESS, CMD_WARNING + * or CMD_ERROR. + * + * In all cases any output required (including any warning or error + * messages) must already have been output. + * + * CMD_WARNING will stop configuration reader, unless ignore warning + * option is set. + * + * CMD_ERROR will always stop the configuration reader. + * + * If there is no output and either CMD_WARNING or CMD_ERROR, then will + * output a general warning message. + * + * All other return codes are for use within the command handler. + */ +enum cmd_return_code +{ + CMD_SUCCESS = 0, /* used generally */ + + /* Return codes suitable for command execution functions */ + + CMD_WARNING = 1, /* command: not 100% successful */ + CMD_ERROR, /* command: failed badly */ + + CMD_CLOSE, /* command: finish up and close vty */ + + /* Return codes from the command parser */ + + CMD_EMPTY, /* parser: nothing to execute */ + + CMD_ERR_PARSING, /* parser: general parser error */ + CMD_ERR_NO_MATCH, /* parser: command/argument not recognised */ + CMD_ERR_AMBIGUOUS, /* parser: more than on command matches */ + CMD_ERR_INCOMPLETE, + + /* Return codes used in command loop */ + + CMD_HIATUS, /* loop: something requires attention */ + CMD_STOP, /* loop: stop and close vty (final) */ + + CMD_CANCEL, /* loop: stop and close down to base + * vin/vout and discard output. */ + + /* Return codes from I/O layers */ + + CMD_WAITING, /* I/O: waiting for more input */ + CMD_EOF, /* I/O: nothing more to come */ + CMD_IO_ERROR, /* I/O: error or time-out */ + + /* For the chop ???? */ + +//CMD_COMPLETE_FULL_MATCH, /* cmd_completion returns */ +//CMD_COMPLETE_MATCH, +//CMD_COMPLETE_LIST_MATCH, +//CMD_COMPLETE_ALREADY, + + + CMD_SUCCESS_DAEMON, /* parser: success & command is for vtysh ? */ +} ; + +typedef enum cmd_return_code cmd_return_code_t ; + +/*------------------------------------------------------------------------------ + * Structure for each node -- root of all commands for the node. + * + * See install_node(). + */ +struct vty ; /* Forward reference */ + +struct cmd_node +{ + node_type_t node ; /* who we are */ + + const char* prompt ; /* prompt string for vty */ + + bool config_to_vtysh ; /* configuration goes to vtysh ? */ + + node_type_t parent ; /* parent when parsing commands */ + node_type_t exit_to ; /* where to go on "exit" */ + node_type_t end_to ; /* where to go on "end", "^C" or "^Z" */ + + int (*config_write) (struct vty*) ; /* configuration write function */ + + vector_t cmd_vector; /* Vector of this node's commands. */ +} ; + +typedef struct cmd_node cmd_node_t ; +typedef struct cmd_node* cmd_node ; + +/*------------------------------------------------------------------------------ + * Commands -- contents of the nodes' cmd_vector(s). + * + * A cmd_command is a static structure, which contains dynamic elements + * which are set when a command is installed. Note that is not uncommon for + * one cmd_command to appear in more than one node. + * + * The command attributes affect: + * + * * the parsing of the command -- in particular how the next_node is + * established. + * + * * whether the command is shown in help (or some forms of help if + * deprecated. + * + * * whether the command can be executed directly in the cli thread + * (avoiding having to wait for the cmd thread's attention -- this may be + * less useful now that all commands are treated a "priority" messages + * going into the cmd thread). + * + * If the command is marked CMD_ATTR_NODE, then the CMD_ATTR_MASK will + * extract the node_type_t that the command will set, if CMD_SUCCESS. This + * means that can parse commands without executing them. + * + * If the command is not marked CMD_ATTR_NODE, then the CMD_ATTR_MASK will + * extract the cmd_special_t value for the command -- which will be + * interesting if it isn't cmd_sp_simple. + */ +enum cmd_attr +{ + CMD_ATTR_SIMPLE = 0, /* bit significant */ + + CMD_ATTR_NODE = BIT(7), /* sets given node */ + CMD_ATTR_MASK = CMD_ATTR_NODE - 1, + + CMD_ATTR_DEPRECATED = BIT(12), + CMD_ATTR_HIDDEN = BIT(13), /* not shown in help */ + CMD_ATTR_DIRECT = BIT(14), /* can run in cli thread */ +}; +typedef enum cmd_attr cmd_attr_t ; + +CONFIRM(CMD_ATTR_MASK >= (cmd_attr_t)MAX_NODE) ; + +/* Special commands, which require extra processing at parse time. */ +enum cmd_special +{ + cmd_sp_simple = 0, + + cmd_sp_end, + cmd_sp_exit, + cmd_sp_enable, + cmd_sp_configure, + + cmd_sp_max_plus_1, + cmd_sp_max = cmd_sp_max_plus_1 - 1 +} ; +typedef enum cmd_special cmd_special_t ; + +CONFIRM(CMD_ATTR_MASK >= (cmd_attr_t)cmd_sp_max) ; + +/* Command functions and macros to define same */ + +struct cmd_command ; +typedef struct cmd_command* cmd_command ; + +typedef const char* const argv_t[] ; + +#define DEFUN_CMD_ARG_UNUSED __attribute__ ((unused)) +#define DEFUN_CMD_FUNCTION(name) \ + enum cmd_return_code name (cmd_command self DEFUN_CMD_ARG_UNUSED, \ + struct vty* vty DEFUN_CMD_ARG_UNUSED, \ + int argc DEFUN_CMD_ARG_UNUSED, \ + argv_t argv DEFUN_CMD_ARG_UNUSED) + +typedef DEFUN_CMD_FUNCTION((cmd_function)) ; + +/* The cmd_command structure itself */ + +struct cmd_item ; /* Defined in command_parse.h */ + +struct cmd_command +{ + const char* string ; /* Command specification by string. */ + cmd_function* func ; + const char* doc ; /* Documentation of this command. */ + int daemon ; /* Daemon to which this command belong. */ + cmd_attr_t attr ; /* Command attributes */ + + vector items ; /* Vector of pointers to cmd_item(s) */ + + uint nt_min ; /* excluding [option](s) */ + uint nt ; /* count of all items */ + uint nt_max ; /* "infinite" if .vararg */ + + struct cmd_item* vararg ; /* if there is a vararg item */ + + char* r_doc ; /* rendered documentation */ + +//char* config ; /* Configuration string */ +//vector subconfig ; /* Sub configuration string */ +}; + +#endif /* _ZEBRA_COMMAND_COMMON_H */ |