]>
git.proxmox.com Git - mirror_frr.git/blob - lib/command.h
2 * Zebra configuration command interface routine
3 * Copyright (C) 1997, 98 Kunihiro Ishiguro
5 * This file is part of GNU Zebra.
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.
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.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #ifndef _ZEBRA_COMMAND_H
23 #define _ZEBRA_COMMAND_H
27 #include "lib/route_types.h"
31 #include "command_graph.h"
37 DECLARE_MTYPE ( COMPLETION
)
40 * From RFC 1123 (Requirements for Internet Hosts), Section 2.1 on hostnames:
41 * One aspect of host name syntax is hereby changed: the restriction on
42 * the first character is relaxed to allow either a letter or a digit.
43 * Host software MUST support this more liberal syntax.
45 * Host software MUST handle host names of up to 63 characters and
46 * SHOULD handle host names of up to 255 characters.
48 #define HOSTNAME_LEN 255
50 /* Host configuration variable */
52 /* Host name of this router. */
55 /* Domainname of this router */
58 /* Password for vty interface. */
60 char * password_encrypt
;
66 /* System wide terminal lines. */
72 /* config file name of this host */
76 /* Flags for services */
80 /* Banner configuration. */
85 /* List of CLI nodes. Please remember to update the name array in command.c. */
87 AUTH_NODE
, /* Authentication mode of vty interface. */
88 VIEW_NODE
, /* View node. Default mode of vty interface. */
89 AUTH_ENABLE_NODE
, /* Authentication mode for change enable. */
90 ENABLE_NODE
, /* Enable node. */
91 CONFIG_NODE
, /* Config node. Default mode of config file. */
92 DEBUG_NODE
, /* Debug node. */
93 VRF_DEBUG_NODE
, /* Vrf Debug node. */
94 NORTHBOUND_DEBUG_NODE
, /* Northbound Debug node. */
95 DEBUG_VNC_NODE
, /* Debug VNC node. */
96 RMAP_DEBUG_NODE
, /* Route-map debug node */
97 AAA_NODE
, /* AAA node. */
98 KEYCHAIN_NODE
, /* Key-chain node. */
99 KEYCHAIN_KEY_NODE
, /* Key-chain key node. */
100 LOGICALROUTER_NODE
, /* Logical-Router node. */
101 IP_NODE
, /* Static ip route node. */
102 VRF_NODE
, /* VRF mode node. */
103 INTERFACE_NODE
, /* Interface mode node. */
104 NH_GROUP_NODE
, /* Nexthop-Group mode node. */
105 ZEBRA_NODE
, /* zebra connection node. */
106 TABLE_NODE
, /* rtm_table selection node. */
107 RIP_NODE
, /* RIP protocol mode node. */
108 RIPNG_NODE
, /* RIPng protocol mode node. */
109 BABEL_NODE
, /* BABEL protocol mode node. */
110 EIGRP_NODE
, /* EIGRP protocol mode node. */
111 BGP_NODE
, /* BGP protocol mode which includes BGP4+ */
112 BGP_VPNV4_NODE
, /* BGP MPLS-VPN PE exchange. */
113 BGP_VPNV6_NODE
, /* BGP MPLS-VPN PE exchange. */
114 BGP_IPV4_NODE
, /* BGP IPv4 unicast address family. */
115 BGP_IPV4M_NODE
, /* BGP IPv4 multicast address family. */
116 BGP_IPV4L_NODE
, /* BGP IPv4 labeled unicast address family. */
117 BGP_IPV6_NODE
, /* BGP IPv6 address family */
118 BGP_IPV6M_NODE
, /* BGP IPv6 multicast address family. */
119 BGP_IPV6L_NODE
, /* BGP IPv6 labeled unicast address family. */
120 BGP_VRF_POLICY_NODE
, /* BGP VRF policy */
121 BGP_VNC_DEFAULTS_NODE
, /* BGP VNC nve defaults */
122 BGP_VNC_NVE_GROUP_NODE
, /* BGP VNC nve group */
123 BGP_VNC_L2_GROUP_NODE
, /* BGP VNC L2 group */
124 RFP_DEFAULTS_NODE
, /* RFP defaults node */
125 BGP_EVPN_NODE
, /* BGP EVPN node. */
126 OSPF_NODE
, /* OSPF protocol mode */
127 OSPF6_NODE
, /* OSPF protocol for IPv6 mode */
128 LDP_NODE
, /* LDP protocol mode */
129 LDP_IPV4_NODE
, /* LDP IPv4 address family */
130 LDP_IPV6_NODE
, /* LDP IPv6 address family */
131 LDP_IPV4_IFACE_NODE
, /* LDP IPv4 Interface */
132 LDP_IPV6_IFACE_NODE
, /* LDP IPv6 Interface */
133 LDP_L2VPN_NODE
, /* LDP L2VPN node */
134 LDP_PSEUDOWIRE_NODE
, /* LDP Pseudowire node */
135 ISIS_NODE
, /* ISIS protocol mode */
136 ACCESS_NODE
, /* Access list node. */
137 PREFIX_NODE
, /* Prefix list node. */
138 ACCESS_IPV6_NODE
, /* Access list node. */
139 ACCESS_MAC_NODE
, /* MAC access list node*/
140 PREFIX_IPV6_NODE
, /* Prefix list node. */
141 AS_LIST_NODE
, /* AS list node. */
142 COMMUNITY_LIST_NODE
, /* Community list node. */
143 RMAP_NODE
, /* Route map node. */
144 PBRMAP_NODE
, /* PBR map node. */
145 SMUX_NODE
, /* SNMP configuration node. */
146 DUMP_NODE
, /* Packet dump node. */
147 FORWARDING_NODE
, /* IP forwarding node. */
148 PROTOCOL_NODE
, /* protocol filtering node */
149 MPLS_NODE
, /* MPLS config node */
150 PW_NODE
, /* Pseudowire config node */
151 VTY_NODE
, /* Vty node. */
152 LINK_PARAMS_NODE
, /* Link-parameters node */
153 BGP_EVPN_VNI_NODE
, /* BGP EVPN VNI */
154 RPKI_NODE
, /* RPKI node for configuration of RPKI cache server
156 BGP_FLOWSPECV4_NODE
, /* BGP IPv4 FLOWSPEC Address-Family */
157 BGP_FLOWSPECV6_NODE
, /* BGP IPv6 FLOWSPEC Address-Family */
158 BFD_NODE
, /* BFD protocol mode. */
159 BFD_PEER_NODE
, /* BFD peer configuration mode. */
160 OPENFABRIC_NODE
, /* OpenFabric router configuration node */
161 VRRP_NODE
, /* VRRP node */
162 NODE_TYPE_MAX
, /* maximum */
165 extern vector cmdvec
;
166 extern const struct message tokennames
[];
167 extern const char * node_names
[];
169 /* Node which has some commands and prompt string and configuration
170 function pointer . */
175 /* Prompt character at vty interface. */
178 /* Is this node's configuration goes to vtysh ? */
181 /* Node's configuration write function */
182 int (* func
)( struct vty
*);
184 /* Node's command graph */
185 struct graph
* cmdgraph
;
187 /* Vector of this node's command list. */
190 /* Hashed index of command node list, for de-dupping primarily */
191 struct hash
* cmd_hash
;
194 /* Return value of the commands. */
195 #define CMD_SUCCESS 0
196 #define CMD_WARNING 1
197 #define CMD_ERR_NO_MATCH 2
198 #define CMD_ERR_AMBIGUOUS 3
199 #define CMD_ERR_INCOMPLETE 4
200 #define CMD_ERR_EXEED_ARGC_MAX 5
201 #define CMD_ERR_NOTHING_TODO 6
202 #define CMD_COMPLETE_FULL_MATCH 7
203 #define CMD_COMPLETE_MATCH 8
204 #define CMD_COMPLETE_LIST_MATCH 9
205 #define CMD_SUCCESS_DAEMON 10
206 #define CMD_ERR_NO_FILE 11
207 #define CMD_SUSPEND 12
208 #define CMD_WARNING_CONFIG_FAILED 13
209 #define CMD_NOT_MY_INSTANCE 14
211 /* Argc max counts. */
212 #define CMD_ARGC_MAX 256
214 /* Turn off these macros when uisng cpp with extract.pl */
215 #ifndef VTYSH_EXTRACT_PL
217 /* helper defines for end-user DEFUN* macros */
218 #define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
219 static struct cmd_element cmdname = { \
228 #define DEFUN_CMD_FUNC_DECL(funcname) \
229 static int funcname(const struct cmd_element *, struct vty *, int, \
230 struct cmd_token *[]);
232 #define DEFUN_CMD_FUNC_TEXT(funcname) \
233 static int funcname(const struct cmd_element *self \
234 __attribute__((unused)), \
235 struct vty *vty __attribute__((unused)), \
236 int argc __attribute__((unused)), \
237 struct cmd_token *argv[] __attribute__((unused)))
239 #define DEFPY(funcname, cmdname, cmdstr, helpstr) \
240 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
243 #define DEFPY_NOSH(funcname, cmdname, cmdstr, helpstr) \
244 DEFPY(funcname, cmdname, cmdstr, helpstr)
246 #define DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
247 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
250 #define DEFPY_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
251 DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
253 #define DEFUN(funcname, cmdname, cmdstr, helpstr) \
254 DEFUN_CMD_FUNC_DECL(funcname) \
255 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
256 DEFUN_CMD_FUNC_TEXT(funcname)
258 #define DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
259 DEFUN_CMD_FUNC_DECL(funcname) \
260 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
261 DEFUN_CMD_FUNC_TEXT(funcname)
263 #define DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
264 DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
266 /* DEFUN_NOSH for commands that vtysh should ignore */
267 #define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) \
268 DEFUN(funcname, cmdname, cmdstr, helpstr)
270 /* DEFSH for vtysh. */
271 #define DEFSH(daemon, cmdname, cmdstr, helpstr) \
272 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, 0, daemon)
274 #define DEFSH_HIDDEN(daemon, cmdname, cmdstr, helpstr) \
275 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
279 #define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
280 DEFUN_CMD_FUNC_DECL(funcname) \
281 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
282 DEFUN_CMD_FUNC_TEXT(funcname)
284 /* DEFUN + DEFSH with attributes */
285 #define DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, attr) \
286 DEFUN_CMD_FUNC_DECL(funcname) \
287 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
288 DEFUN_CMD_FUNC_TEXT(funcname)
290 #define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
291 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, \
294 #define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
295 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, \
298 /* ALIAS macro which define existing command's alias. */
299 #define ALIAS(funcname, cmdname, cmdstr, helpstr) \
300 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
302 #define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
303 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
305 #define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
306 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
309 #define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
310 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, \
311 CMD_ATTR_DEPRECATED, 0)
313 #define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr) \
314 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
316 #define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
317 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
320 #define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
321 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, \
322 CMD_ATTR_DEPRECATED, daemon)
324 #else /* VTYSH_EXTRACT_PL */
325 #define DEFPY(funcname, cmdname, cmdstr, helpstr) \
326 DEFUN(funcname, cmdname, cmdstr, helpstr)
328 #define DEFPY_NOSH(funcname, cmdname, cmdstr, helpstr) \
329 DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr)
331 #define DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
332 DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr)
334 #define DEFPY_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
335 DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr)
336 #endif /* VTYSH_EXTRACT_PL */
341 * Sometimes #defines create maximum values that
342 * need to have strings created from them that
343 * allow the parser to match against them.
344 * These macros allow that.
346 #define CMD_CREATE_STR(s) CMD_CREATE_STR_HELPER(s)
347 #define CMD_CREATE_STR_HELPER(s) #s
348 #define CMD_RANGE_STR(a,s) "(" CMD_CREATE_STR(a) "-" CMD_CREATE_STR(s) ")"
350 /* Common descriptions. */
351 #define SHOW_STR "Show running system information \n "
352 #define IP_STR "IP information \n "
353 #define IPV6_STR "IPv6 information \n "
354 #define NO_STR "Negate a command or set its defaults \n "
355 #define REDIST_STR "Redistribute information from another routing protocol \n "
356 #define CLEAR_STR "Reset functions \n "
357 #define RIP_STR "RIP information \n "
358 #define EIGRP_STR "EIGRP information \n "
359 #define BGP_STR "BGP information \n "
360 #define BGP_SOFT_STR "Soft reconfig inbound and outbound updates \n "
361 #define BGP_SOFT_IN_STR "Send route-refresh unless using 'soft-reconfiguration inbound' \n "
362 #define BGP_SOFT_OUT_STR "Resend all outbound updates \n "
363 #define BGP_SOFT_RSCLIENT_RIB_STR "Soft reconfig for rsclient RIB \n "
364 #define OSPF_STR "OSPF information \n "
365 #define NEIGHBOR_STR "Specify neighbor router \n "
366 #define DEBUG_STR "Debugging functions \n "
367 #define UNDEBUG_STR "Disable debugging functions (see also 'debug') \n "
368 #define ROUTER_STR "Enable a routing process \n "
369 #define AS_STR "AS number \n "
370 #define MAC_STR "MAC address \n "
371 #define MBGP_STR "MBGP information \n "
372 #define MATCH_STR "Match values from routing table \n "
373 #define SET_STR "Set values in destination routing protocol \n "
374 #define OUT_STR "Filter outgoing routing updates \n "
375 #define IN_STR "Filter incoming routing updates \n "
376 #define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0) \n "
377 #define OSPF6_NUMBER_STR "Specify by number \n "
378 #define INTERFACE_STR "Interface information \n "
379 #define IFNAME_STR "Interface name(e.g. ep0) \n "
380 #define IP6_STR "IPv6 Information \n "
381 #define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6 \n "
382 #define OSPF6_INSTANCE_STR "(1-65535) Instance ID \n "
383 #define SECONDS_STR "Seconds \n "
384 #define ROUTE_STR "Routing Table \n "
385 #define PREFIX_LIST_STR "Build a prefix list \n "
386 #define OSPF6_DUMP_TYPE_LIST \
387 "<neighbor|interface|area|lsa|zebra|config|dbex|spf|route|lsdb|redistribute|hook|asbr|prefix|abr>"
388 #define AREA_TAG_STR "[area tag] \n "
389 #define COMMUNITY_AANN_STR "Community number where AA and NN are (0-65535) \n "
390 #define COMMUNITY_VAL_STR "Community number in AA:NN format (where AA and NN are (0-65535)) or local-AS|no-advertise|no-export|internet or additive \n "
391 #define MPLS_TE_STR "MPLS-TE specific commands \n "
392 #define LINK_PARAMS_STR "Configure interface link parameters \n "
393 #define OSPF_RI_STR "OSPF Router Information specific commands \n "
394 #define PCE_STR "PCE Router Information specific commands \n "
395 #define MPLS_STR "MPLS information \n "
396 #define SR_STR "Segment-Routing specific commands \n "
397 #define WATCHFRR_STR "watchfrr information \n "
398 #define ZEBRA_STR "Zebra information \n "
399 #define FILTER_LOG_STR "Filter Logs \n "
401 #define CMD_VNI_RANGE "(1-16777215)"
402 #define CONF_BACKUP_EXT ".sav"
404 /* Command warnings. */
405 #define NO_PASSWD_CMD_WARNING \
406 "Please be aware that removing the password is a security risk and you should think twice about this command. \n "
408 /* IPv4 only machine should not accept IPv6 address for peer's IP
409 address. So we replace VTY command string like below. */
410 #define NEIGHBOR_ADDR_STR "Neighbor address \n IPv6 address \n "
411 #define NEIGHBOR_ADDR_STR2 "Neighbor address \n Neighbor IPv6 address \n Interface name or neighbor tag \n "
412 #define NEIGHBOR_ADDR_STR3 "Neighbor address \n IPv6 address \n Interface name \n "
415 #define DAEMONS_STR \
416 "For the zebra daemon \n For the rip daemon \n For the ripng daemon \n For the ospf daemon \n For the ospfv6 daemon \n For the bgp daemon \n For the isis daemon \n For the pbr daemon \n For the fabricd daemon \n For the pim daemon \n For the static daemon \n For the sharpd daemon \n For the vrrpd daemon \n "
417 #define DAEMONS_LIST \
418 "<zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|pbrd|fabricd|pimd|staticd|sharpd|vrrpd>"
421 extern void install_node ( struct cmd_node
*, int (*)( struct vty
*));
422 extern void install_default ( enum node_type
);
423 extern void install_element ( enum node_type
, struct cmd_element
*);
425 /* known issue with uninstall_element: changes to cmd_token->attr (i.e.
426 * deprecated/hidden) are not reversed. */
427 extern void uninstall_element ( enum node_type
, struct cmd_element
*);
429 /* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
430 string with a space between each element (allocated using
431 XMALLOC(MTYPE_TMP)). Returns NULL if shift >= argc. */
432 extern char * argv_concat ( struct cmd_token
** argv
, int argc
, int shift
);
435 * It is preferred that you set the index initial value
436 * to a 0. This way in the future if you modify the
437 * cli then there is no need to modify the initial
440 extern int argv_find ( struct cmd_token
** argv
, int argc
, const char * text
,
443 extern vector
cmd_make_strvec ( const char *);
444 extern void cmd_free_strvec ( vector
);
445 extern vector
cmd_describe_command ( vector
, struct vty
*, int * status
);
446 extern char ** cmd_complete_command ( vector
, struct vty
*, int * status
);
447 extern const char * cmd_prompt ( enum node_type
);
448 extern int command_config_read_one_line ( struct vty
* vty
,
449 const struct cmd_element
**,
450 uint32_t line_num
, int use_config_node
);
451 extern int config_from_file ( struct vty
*, FILE *, unsigned int * line_num
);
452 extern enum node_type
node_parent ( enum node_type
);
454 * Execute command under the given vty context.
457 * The vty context to execute under.
460 * The command string to execute.
463 * If non-null and a match was found, the address of the matched command is
464 * stored here. No action otherwise.
467 * Whether or not this is being called from vtysh. If this is nonzero,
471 * XXX: what does it return
473 extern int cmd_execute ( struct vty
* vty
, const char * cmd
,
474 const struct cmd_element
** matched
, int vtysh
);
475 extern int cmd_execute_command ( vector
, struct vty
*,
476 const struct cmd_element
**, int );
477 extern int cmd_execute_command_strict ( vector
, struct vty
*,
478 const struct cmd_element
**);
479 extern void cmd_init ( int );
480 extern void cmd_terminate ( void );
481 extern void cmd_exit ( struct vty
* vty
);
482 extern int cmd_list_cmds ( struct vty
* vty
, int do_permute
);
484 extern int cmd_domainname_set ( const char * domainname
);
485 extern int cmd_hostname_set ( const char * hostname
);
486 extern const char * cmd_hostname_get ( void );
487 extern const char * cmd_domainname_get ( void );
489 /* NOT safe for general use; call this only if DEV_BUILD! */
490 extern void grammar_sandbox_init ( void );
492 extern vector
completions_to_vec ( struct list
* completions
);
494 /* Export typical functions. */
495 extern const char * host_config_get ( void );
496 extern void host_config_set ( const char *);
498 extern void print_version ( const char *);
500 extern int cmd_banner_motd_file ( const char *);
502 /* struct host global, ick */
503 extern struct host host
;
505 struct cmd_variable_handler
{
506 const char * tokenname
, * varname
;
507 void (* completions
)( vector out
, struct cmd_token
* token
);
510 extern void cmd_variable_complete ( struct cmd_token
* token
, const char * arg
,
513 cmd_variable_handler_register ( const struct cmd_variable_handler
* cvh
);
514 extern char * cmd_variable_comp2str ( vector comps
, unsigned short cols
);
516 extern void command_setup_early_logging ( const char * dest
, const char * level
);
522 #endif /* _ZEBRA_COMMAND_H */