command.h
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:10k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * Zebra configuration command interface routine
  3.  * Copyright (C) 1997, 98 Kunihiro Ishiguro
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published
  9.  * by the Free Software Foundation; either version 2, or (at your
  10.  * option) any later version.
  11.  * 
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the
  19.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  20.  * Boston, MA 02111-1307, USA.
  21.  */
  22. #ifndef _ZEBRA_COMMAND_H
  23. #define _ZEBRA_COMMAND_H
  24. #include "vector.h"
  25. #include "vty.h"
  26. /* Host configuration variable */
  27. struct host
  28. {
  29.   /* Host name of this router. */
  30.   char *name;
  31.   /* Password for vty interface. */
  32.   char *password;
  33.   char *password_encrypt;
  34.   /* Enable password */
  35.   char *enable;
  36.   char *enable_encrypt;
  37.   /* System wide terminal lines. */
  38.   int lines;
  39.   /* Log filename. */
  40.   char *logfile;
  41.   /* Log stdout. */
  42.   u_char log_stdout;
  43.   /* Log syslog. */
  44.   u_char log_syslog;
  45.   
  46.   /* config file name of this host */
  47.   char *config;
  48.   /* Flags for services */
  49.   int advanced;
  50.   int encrypt;
  51.   /* Banner configuration. */
  52.   char *motd;
  53. };
  54. /* There are some command levels which called from command node. */
  55. enum node_type 
  56. {
  57.   AUTH_NODE, /* Authentication mode of vty interface. */
  58.   VIEW_NODE, /* View node. Default mode of vty interface. */
  59.   AUTH_ENABLE_NODE, /* Authentication mode for change enable. */
  60.   ENABLE_NODE, /* Enable node. */
  61.   CONFIG_NODE, /* Config node. Default mode of config file. */
  62.   DEBUG_NODE, /* Debug node. */
  63.   AAA_NODE, /* AAA node. */
  64.   KEYCHAIN_NODE, /* Key-chain node. */
  65.   KEYCHAIN_KEY_NODE, /* Key-chain key node. */
  66.   INTERFACE_NODE, /* Interface mode node. */
  67.   ZEBRA_NODE, /* zebra connection node. */
  68.   TABLE_NODE, /* rtm_table selection node. */
  69.   RIP_NODE, /* RIP protocol mode node. */ 
  70.   RIPNG_NODE, /* RIPng protocol mode node. */
  71.   BGP_NODE, /* BGP protocol mode which includes BGP4+ */
  72.   BGP_VPNV4_NODE, /* BGP MPLS-VPN PE exchange. */
  73.   BGP_IPV4_NODE, /* BGP IPv4 unicast address family.  */
  74.   BGP_IPV4M_NODE, /* BGP IPv4 multicast address family.  */
  75.   BGP_IPV6_NODE, /* BGP IPv6 address family */
  76.   OSPF_NODE, /* OSPF protocol mode */
  77.   OSPF6_NODE, /* OSPF protocol for IPv6 mode */
  78.   MASC_NODE, /* MASC for multicast.  */
  79.   IRDP_NODE, /* ICMP Router Discovery Protocol mode. */ 
  80.   IP_NODE, /* Static ip route node. */
  81.   ACCESS_NODE, /* Access list node. */
  82.   PREFIX_NODE, /* Prefix list node. */
  83.   ACCESS_IPV6_NODE, /* Access list node. */
  84.   PREFIX_IPV6_NODE, /* Prefix list node. */
  85.   AS_LIST_NODE, /* AS list node. */
  86.   COMMUNITY_LIST_NODE, /* Community list node. */
  87.   RMAP_NODE, /* Route map node. */
  88.   SMUX_NODE, /* SNMP configuration node. */
  89.   DUMP_NODE, /* Packet dump node. */
  90.   FORWARDING_NODE, /* IP forwarding node. */
  91.   VTY_NODE /* Vty node. */
  92. };
  93. /* Node which has some commands and prompt string and configuration
  94.    function pointer . */
  95. struct cmd_node 
  96. {
  97.   /* Node index. */
  98.   enum node_type node;
  99.   /* Prompt character at vty interface. */
  100.   char *prompt;
  101.   /* Is this node's configuration goes to vtysh ? */
  102.   int vtysh;
  103.   
  104.   /* Node's configuration write function */
  105.   int (*func) (struct vty *);
  106.   /* Vector of this node's command list. */
  107.   vector cmd_vector;
  108. };
  109. /* Structure of command element. */
  110. struct cmd_element 
  111. {
  112.   char *string; /* Command specification by string. */
  113.   int (*func) (struct cmd_element *, struct vty *, int, char **);
  114.   char *doc; /* Documentation of this command. */
  115.   int daemon;                   /* Daemon to which this command belong. */
  116.   vector strvec; /* Pointing out each description vector. */
  117.   int cmdsize; /* Command index count. */
  118.   char *config; /* Configuration string */
  119.   vector subconfig; /* Sub configuration string */
  120. };
  121. /* Command description structure. */
  122. struct desc
  123. {
  124.   char *cmd; /* Command string. */
  125.   char *str; /* Command's description. */
  126. };
  127. /* Return value of the commands. */
  128. #define CMD_SUCCESS              0
  129. #define CMD_WARNING              1
  130. #define CMD_ERR_NO_MATCH         2
  131. #define CMD_ERR_AMBIGUOUS        3
  132. #define CMD_ERR_INCOMPLETE       4
  133. #define CMD_ERR_EXEED_ARGC_MAX   5
  134. #define CMD_ERR_NOTHING_TODO     6
  135. #define CMD_COMPLETE_FULL_MATCH  7
  136. #define CMD_COMPLETE_MATCH       8
  137. #define CMD_COMPLETE_LIST_MATCH  9
  138. #define CMD_SUCCESS_DAEMON      10
  139. /* Argc max counts. */
  140. #define CMD_ARGC_MAX   25
  141. /* Turn off these macros when uisng cpp with extract.pl */
  142. #ifndef VTYSH_EXTRACT_PL  
  143. /* DEFUN for vty command interafce. Little bit hacky ;-). */
  144. #define DEFUN(funcname, cmdname, cmdstr, helpstr) 
  145.   int funcname (struct cmd_element *, struct vty *, int, char **); 
  146.   struct cmd_element cmdname = 
  147.   { 
  148.     cmdstr, 
  149.     funcname, 
  150.     helpstr 
  151.   }; 
  152.   int funcname 
  153.   (struct cmd_element *self, struct vty *vty, int argc, char **argv)
  154. /* DEFUN_NOSH for commands that vtysh should ignore */
  155. #define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) 
  156.   DEFUN(funcname, cmdname, cmdstr, helpstr)
  157. /* DEFSH for vtysh. */
  158. #define DEFSH(daemon, cmdname, cmdstr, helpstr) 
  159.   struct cmd_element cmdname = 
  160.   { 
  161.     cmdstr, 
  162.     NULL, 
  163.     helpstr, 
  164.     daemon 
  165.   }; 
  166. /* DEFUN + DEFSH */
  167. #define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) 
  168.   int funcname (struct cmd_element *, struct vty *, int, char **); 
  169.   struct cmd_element cmdname = 
  170.   { 
  171.     cmdstr, 
  172.     funcname, 
  173.     helpstr, 
  174.     daemon 
  175.   }; 
  176.   int funcname 
  177.   (struct cmd_element *self, struct vty *vty, int argc, char **argv)
  178. /* ALIAS macro which define existing command's alias. */
  179. #define ALIAS(funcname, cmdname, cmdstr, helpstr) 
  180.   struct cmd_element cmdname = 
  181.   { 
  182.     cmdstr, 
  183.     funcname, 
  184.     helpstr 
  185.   };
  186. #endif /* VTYSH_EXTRACT_PL */
  187. /* Some macroes */
  188. #define CMD_OPTION(S)   ((S[0]) == '[')
  189. #define CMD_VARIABLE(S) (((S[0]) >= 'A' && (S[0]) <= 'Z') || ((S[0]) == '<'))
  190. #define CMD_VARARG(S)   ((S[0]) == '.')
  191. #define CMD_RANGE(S) ((S[0] == '<'))
  192. #define CMD_IPV4(S)    ((strcmp ((S), "A.B.C.D") == 0))
  193. #define CMD_IPV4_PREFIX(S) ((strcmp ((S), "A.B.C.D/M") == 0))
  194. #define CMD_IPV6(S)        ((strcmp ((S), "X:X::X:X") == 0))
  195. #define CMD_IPV6_PREFIX(S) ((strcmp ((S), "X:X::X:X/M") == 0))
  196. /* Common descriptions. */
  197. #define SHOW_STR "Show running system informationn"
  198. #define IP_STR "IP informationn"
  199. #define IPV6_STR "IPv6 informationn"
  200. #define NO_STR "Negate a command or set its defaultsn"
  201. #define CLEAR_STR "Reset functionsn"
  202. #define RIP_STR "RIP informationn"
  203. #define BGP_STR "BGP informationn"
  204. #define OSPF_STR "OSPF informationn"
  205. #define NEIGHBOR_STR "Specify neighbor routern"
  206. #define DEBUG_STR "Debugging functions (see also 'undebug')n"
  207. #define UNDEBUG_STR "Disable debugging functions (see also 'debug')n"
  208. #define ROUTER_STR "Enable a routing processn"
  209. #define AS_STR "AS numbern"
  210. #define MBGP_STR "MBGP informationn"
  211. #define MATCH_STR "Match values from routing tablen"
  212. #define SET_STR "Set values in destination routing protocoln"
  213. #define OUT_STR "Filter outgoing routing updatesn"
  214. #define IN_STR  "Filter incoming routing updatesn"
  215. #define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0)n"
  216. #define OSPF6_NUMBER_STR "Specify by numbern"
  217. #define INTERFACE_STR "Interface infomationn"
  218. #define IFNAME_STR "Interface name(e.g. ep0)n"
  219. #define IP6_STR "IPv6 Informationn"
  220. #define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6n"
  221. #define OSPF6_ROUTER_STR "Enable a routing processn"
  222. #define OSPF6_INSTANCE_STR "<1-65535> Instance IDn"
  223. #define SECONDS_STR "<1-65535> Secondsn"
  224. #define ROUTE_STR "Routing Tablen"
  225. #define PREFIX_LIST_STR "Build a prefix listn"
  226. #define OSPF6_DUMP_TYPE_LIST 
  227. "(neighbor|interface|area|lsa|zebra|config|dbex|spf|route|lsdb|redistribute|hook|asbr|prefix|abr)"
  228. #define CONF_BACKUP_EXT ".sav"
  229. /* IPv4 only machine should not accept IPv6 address for peer's IP
  230.    address.  So we replace VTY command string like below. */
  231. #ifdef HAVE_IPV6
  232. #define NEIGHBOR_CMD       "neighbor (A.B.C.D|X:X::X:X) "
  233. #define NO_NEIGHBOR_CMD    "no neighbor (A.B.C.D|X:X::X:X) "
  234. #define NEIGHBOR_ADDR_STR  "Neighbor addressnIPv6 addressn"
  235. #define NEIGHBOR_CMD2      "neighbor (A.B.C.D|X:X::X:X|WORD) "
  236. #define NO_NEIGHBOR_CMD2   "no neighbor (A.B.C.D|X:X::X:X|WORD) "
  237. #define NEIGHBOR_ADDR_STR2 "Neighbor addressnNeighbor IPv6 addressnNeighbor tagn"
  238. #else
  239. #define NEIGHBOR_CMD       "neighbor A.B.C.D "
  240. #define NO_NEIGHBOR_CMD    "no neighbor A.B.C.D "
  241. #define NEIGHBOR_ADDR_STR  "Neighbor addressn"
  242. #define NEIGHBOR_CMD2      "neighbor (A.B.C.D|WORD) "
  243. #define NO_NEIGHBOR_CMD2   "no neighbor (A.B.C.D|WORD) "
  244. #define NEIGHBOR_ADDR_STR2 "Neighbor addressnNeighbor tagn"
  245. #endif /* HAVE_IPV6 */
  246. /* Prototypes. */
  247. void install_node (struct cmd_node *, int (*) (struct vty *));
  248. void install_default (enum node_type);
  249. void install_element (enum node_type, struct cmd_element *);
  250. void sort_node ();
  251. char *argv_concat (char **, int, int);
  252. vector cmd_make_strvec (char *);
  253. void cmd_free_strvec (vector);
  254. vector cmd_describe_command ();
  255. char **cmd_complete_command ();
  256. char *cmd_prompt (enum node_type);
  257. int config_from_file (struct vty *, FILE *);
  258. int cmd_execute_command (vector, struct vty *, struct cmd_element **);
  259. int cmd_execute_command_strict (vector, struct vty *, struct cmd_element **);
  260. void config_replace_string (struct cmd_element *, char *, ...);
  261. void cmd_init (int);
  262. /* Export typical functions. */
  263. extern struct cmd_element config_end_cmd;
  264. extern struct cmd_element config_exit_cmd;
  265. extern struct cmd_element config_quit_cmd;
  266. extern struct cmd_element config_help_cmd;
  267. extern struct cmd_element config_list_cmd;
  268. int config_exit (struct cmd_element *, struct vty *, int, char **);
  269. int config_help (struct cmd_element *, struct vty *, int, char **);
  270. char *host_config_file ();
  271. void host_config_set (char *);
  272. #endif /* _ZEBRA_COMMAND_H */