]> git.proxmox.com Git - mirror_frr.git/blob - lib/command.h
Merge pull request #7220 from idryzhov/fix-clear-isis
[mirror_frr.git] / lib / command.h
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 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
20 */
21
22 #ifndef _ZEBRA_COMMAND_H
23 #define _ZEBRA_COMMAND_H
24
25 #include "vector.h"
26 #include "vty.h"
27 #include "lib/route_types.h"
28 #include "graph.h"
29 #include "memory.h"
30 #include "hash.h"
31 #include "command_graph.h"
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 DECLARE_MTYPE(COMPLETION)
38
39 /*
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.
44 *
45 * Host software MUST handle host names of up to 63 characters and
46 * SHOULD handle host names of up to 255 characters.
47 */
48 #define HOSTNAME_LEN 255
49
50 /* Host configuration variable */
51 struct host {
52 /* Host name of this router. */
53 char *name;
54
55 /* Domainname of this router */
56 char *domainname;
57
58 /* Password for vty interface. */
59 char *password;
60 char *password_encrypt;
61
62 /* Enable password */
63 char *enable;
64 char *enable_encrypt;
65
66 /* System wide terminal lines. */
67 int lines;
68
69 /* config file name of this host */
70 char *config;
71 int noconfig;
72
73 /* Flags for services */
74 int advanced;
75 int encrypt;
76
77 /* Banner configuration. */
78 char *motd;
79 char *motdfile;
80 };
81
82 /* List of CLI nodes. Please remember to update the name array in command.c. */
83 enum node_type {
84 AUTH_NODE, /* Authentication mode of vty interface. */
85 VIEW_NODE, /* View node. Default mode of vty interface. */
86 AUTH_ENABLE_NODE, /* Authentication mode for change enable. */
87 ENABLE_NODE, /* Enable node. */
88 CONFIG_NODE, /* Config node. Default mode of config file. */
89 DEBUG_NODE, /* Debug node. */
90 VRF_DEBUG_NODE, /* Vrf Debug node. */
91 NORTHBOUND_DEBUG_NODE, /* Northbound Debug node. */
92 DEBUG_VNC_NODE, /* Debug VNC node. */
93 RMAP_DEBUG_NODE, /* Route-map debug node */
94 RESOLVER_DEBUG_NODE, /* Resolver debug node */
95 AAA_NODE, /* AAA node. */
96 KEYCHAIN_NODE, /* Key-chain node. */
97 KEYCHAIN_KEY_NODE, /* Key-chain key node. */
98 IP_NODE, /* Static ip route node. */
99 VRF_NODE, /* VRF mode node. */
100 INTERFACE_NODE, /* Interface mode node. */
101 NH_GROUP_NODE, /* Nexthop-Group mode node. */
102 ZEBRA_NODE, /* zebra connection node. */
103 TABLE_NODE, /* rtm_table selection node. */
104 RIP_NODE, /* RIP protocol mode node. */
105 RIPNG_NODE, /* RIPng protocol mode node. */
106 BABEL_NODE, /* BABEL protocol mode node. */
107 EIGRP_NODE, /* EIGRP protocol mode node. */
108 BGP_NODE, /* BGP protocol mode which includes BGP4+ */
109 BGP_VPNV4_NODE, /* BGP MPLS-VPN PE exchange. */
110 BGP_VPNV6_NODE, /* BGP MPLS-VPN PE exchange. */
111 BGP_IPV4_NODE, /* BGP IPv4 unicast address family. */
112 BGP_IPV4M_NODE, /* BGP IPv4 multicast address family. */
113 BGP_IPV4L_NODE, /* BGP IPv4 labeled unicast address family. */
114 BGP_IPV6_NODE, /* BGP IPv6 address family */
115 BGP_IPV6M_NODE, /* BGP IPv6 multicast address family. */
116 BGP_IPV6L_NODE, /* BGP IPv6 labeled unicast address family. */
117 BGP_VRF_POLICY_NODE, /* BGP VRF policy */
118 BGP_VNC_DEFAULTS_NODE, /* BGP VNC nve defaults */
119 BGP_VNC_NVE_GROUP_NODE, /* BGP VNC nve group */
120 BGP_VNC_L2_GROUP_NODE, /* BGP VNC L2 group */
121 RFP_DEFAULTS_NODE, /* RFP defaults node */
122 BGP_EVPN_NODE, /* BGP EVPN node. */
123 OSPF_NODE, /* OSPF protocol mode */
124 OSPF6_NODE, /* OSPF protocol for IPv6 mode */
125 LDP_NODE, /* LDP protocol mode */
126 LDP_IPV4_NODE, /* LDP IPv4 address family */
127 LDP_IPV6_NODE, /* LDP IPv6 address family */
128 LDP_IPV4_IFACE_NODE, /* LDP IPv4 Interface */
129 LDP_IPV6_IFACE_NODE, /* LDP IPv6 Interface */
130 LDP_L2VPN_NODE, /* LDP L2VPN node */
131 LDP_PSEUDOWIRE_NODE, /* LDP Pseudowire node */
132 ISIS_NODE, /* ISIS protocol mode */
133 ACCESS_NODE, /* Access list node. */
134 PREFIX_NODE, /* Prefix list node. */
135 ACCESS_IPV6_NODE, /* Access list node. */
136 ACCESS_MAC_NODE, /* MAC access list node*/
137 PREFIX_IPV6_NODE, /* Prefix list node. */
138 AS_LIST_NODE, /* AS list node. */
139 COMMUNITY_LIST_NODE, /* Community list node. */
140 RMAP_NODE, /* Route map node. */
141 PBRMAP_NODE, /* PBR map node. */
142 SMUX_NODE, /* SNMP configuration node. */
143 DUMP_NODE, /* Packet dump node. */
144 FORWARDING_NODE, /* IP forwarding node. */
145 PROTOCOL_NODE, /* protocol filtering node */
146 MPLS_NODE, /* MPLS config node */
147 PW_NODE, /* Pseudowire config node */
148 VTY_NODE, /* Vty node. */
149 FPM_NODE, /* Dataplane FPM node. */
150 LINK_PARAMS_NODE, /* Link-parameters node */
151 BGP_EVPN_VNI_NODE, /* BGP EVPN VNI */
152 RPKI_NODE, /* RPKI node for configuration of RPKI cache server
153 connections.*/
154 BGP_FLOWSPECV4_NODE, /* BGP IPv4 FLOWSPEC Address-Family */
155 BGP_FLOWSPECV6_NODE, /* BGP IPv6 FLOWSPEC Address-Family */
156 BFD_NODE, /* BFD protocol mode. */
157 BFD_PEER_NODE, /* BFD peer configuration mode. */
158 BFD_PROFILE_NODE, /* BFD profile configuration mode. */
159 OPENFABRIC_NODE, /* OpenFabric router configuration node */
160 VRRP_NODE, /* VRRP node */
161 BMP_NODE, /* BMP config under router bgp */
162 NODE_TYPE_MAX, /* maximum */
163 };
164
165 extern vector cmdvec;
166 extern const struct message tokennames[];
167
168 /* for external users depending on struct layout */
169 #define FRR_CMD_NODE_20200416
170
171 /* Node which has some commands and prompt string and configuration
172 function pointer . */
173 struct cmd_node {
174 const char *name;
175
176 /* Node index. */
177 enum node_type node;
178 enum node_type parent_node;
179
180 /* Prompt character at vty interface. */
181 const char *prompt;
182
183 /* Node's configuration write function */
184 int (*config_write)(struct vty *);
185
186 /* called when leaving the node on a VTY session.
187 * return 1 if normal exit processing should happen, 0 to suppress
188 */
189 int (*node_exit)(struct vty *);
190
191 /* Node's command graph */
192 struct graph *cmdgraph;
193
194 /* Vector of this node's command list. */
195 vector cmd_vector;
196
197 /* Hashed index of command node list, for de-dupping primarily */
198 struct hash *cmd_hash;
199 };
200
201 /* Return value of the commands. */
202 #define CMD_SUCCESS 0
203 #define CMD_WARNING 1
204 #define CMD_ERR_NO_MATCH 2
205 #define CMD_ERR_AMBIGUOUS 3
206 #define CMD_ERR_INCOMPLETE 4
207 #define CMD_ERR_EXEED_ARGC_MAX 5
208 #define CMD_ERR_NOTHING_TODO 6
209 #define CMD_COMPLETE_FULL_MATCH 7
210 #define CMD_COMPLETE_MATCH 8
211 #define CMD_COMPLETE_LIST_MATCH 9
212 #define CMD_SUCCESS_DAEMON 10
213 #define CMD_ERR_NO_FILE 11
214 #define CMD_SUSPEND 12
215 #define CMD_WARNING_CONFIG_FAILED 13
216 #define CMD_NOT_MY_INSTANCE 14
217
218 /* Argc max counts. */
219 #define CMD_ARGC_MAX 256
220
221 /* Turn off these macros when uisng cpp with extract.pl */
222 #ifndef VTYSH_EXTRACT_PL
223
224 /* helper defines for end-user DEFUN* macros */
225 #define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
226 static const struct cmd_element cmdname = { \
227 .string = cmdstr, \
228 .func = funcname, \
229 .doc = helpstr, \
230 .attr = attrs, \
231 .daemon = dnum, \
232 .name = #cmdname, \
233 };
234
235 #define DEFUN_CMD_FUNC_DECL(funcname) \
236 static int funcname(const struct cmd_element *, struct vty *, int, \
237 struct cmd_token *[]);
238
239 #define DEFUN_CMD_FUNC_TEXT(funcname) \
240 static int funcname(const struct cmd_element *self \
241 __attribute__((unused)), \
242 struct vty *vty __attribute__((unused)), \
243 int argc __attribute__((unused)), \
244 struct cmd_token *argv[] __attribute__((unused)))
245
246 #define DEFPY(funcname, cmdname, cmdstr, helpstr) \
247 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
248 funcdecl_##funcname
249
250 #define DEFPY_NOSH(funcname, cmdname, cmdstr, helpstr) \
251 DEFPY(funcname, cmdname, cmdstr, helpstr)
252
253 #define DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
254 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
255 funcdecl_##funcname
256
257 #define DEFPY_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
258 DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
259
260 #define DEFPY_YANG(funcname, cmdname, cmdstr, helpstr) \
261 DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_YANG)
262
263 #define DEFPY_YANG_NOSH(funcname, cmdname, cmdstr, helpstr) \
264 DEFPY_YANG(funcname, cmdname, cmdstr, helpstr)
265
266 #define DEFUN(funcname, cmdname, cmdstr, helpstr) \
267 DEFUN_CMD_FUNC_DECL(funcname) \
268 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
269 DEFUN_CMD_FUNC_TEXT(funcname)
270
271 #define DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
272 DEFUN_CMD_FUNC_DECL(funcname) \
273 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
274 DEFUN_CMD_FUNC_TEXT(funcname)
275
276 #define DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
277 DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
278
279 #define DEFUN_YANG(funcname, cmdname, cmdstr, helpstr) \
280 DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_YANG)
281
282 /* DEFUN_NOSH for commands that vtysh should ignore */
283 #define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) \
284 DEFUN(funcname, cmdname, cmdstr, helpstr)
285
286 #define DEFUN_YANG_NOSH(funcname, cmdname, cmdstr, helpstr) \
287 DEFUN_YANG(funcname, cmdname, cmdstr, helpstr)
288
289 /* DEFSH for vtysh. */
290 #define DEFSH(daemon, cmdname, cmdstr, helpstr) \
291 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, 0, daemon)
292
293 #define DEFSH_HIDDEN(daemon, cmdname, cmdstr, helpstr) \
294 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
295 daemon)
296
297 #define DEFSH_YANG(daemon, cmdname, cmdstr, helpstr) \
298 DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, CMD_ATTR_YANG, daemon)
299
300 /* DEFUN + DEFSH */
301 #define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
302 DEFUN_CMD_FUNC_DECL(funcname) \
303 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
304 DEFUN_CMD_FUNC_TEXT(funcname)
305
306 /* DEFUN + DEFSH with attributes */
307 #define DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, attr) \
308 DEFUN_CMD_FUNC_DECL(funcname) \
309 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
310 DEFUN_CMD_FUNC_TEXT(funcname)
311
312 #define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
313 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, \
314 CMD_ATTR_HIDDEN)
315
316 #define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
317 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, \
318 CMD_ATTR_DEPRECATED)
319
320 #define DEFUNSH_YANG(daemon, funcname, cmdname, cmdstr, helpstr) \
321 DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_YANG)
322
323 /* ALIAS macro which define existing command's alias. */
324 #define ALIAS(funcname, cmdname, cmdstr, helpstr) \
325 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
326
327 #define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
328 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
329
330 #define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
331 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
332 0)
333
334 #define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
335 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, \
336 CMD_ATTR_DEPRECATED, 0)
337
338 #define ALIAS_YANG(funcname, cmdname, cmdstr, helpstr) \
339 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_YANG, 0)
340
341 #define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr) \
342 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
343
344 #define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
345 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, \
346 daemon)
347
348 #define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
349 DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, \
350 CMD_ATTR_DEPRECATED, daemon)
351
352 #endif /* VTYSH_EXTRACT_PL */
353
354 /* Some macroes */
355
356 /*
357 * Sometimes #defines create maximum values that
358 * need to have strings created from them that
359 * allow the parser to match against them.
360 * These macros allow that.
361 */
362 #define CMD_CREATE_STR(s) CMD_CREATE_STR_HELPER(s)
363 #define CMD_CREATE_STR_HELPER(s) #s
364 #define CMD_RANGE_STR(a,s) "(" CMD_CREATE_STR(a) "-" CMD_CREATE_STR(s) ")"
365
366 /* Common descriptions. */
367 #define SHOW_STR "Show running system information\n"
368 #define IP_STR "IP information\n"
369 #define IPV6_STR "IPv6 information\n"
370 #define SRTE_STR "SR-TE information\n"
371 #define SRTE_COLOR_STR "SR-TE Color information\n"
372 #define NO_STR "Negate a command or set its defaults\n"
373 #define REDIST_STR "Redistribute information from another routing protocol\n"
374 #define CLEAR_STR "Reset functions\n"
375 #define RIP_STR "RIP information\n"
376 #define EIGRP_STR "EIGRP information\n"
377 #define BGP_STR "BGP information\n"
378 #define BGP_SOFT_STR "Soft reconfig inbound and outbound updates\n"
379 #define BGP_SOFT_IN_STR "Send route-refresh unless using 'soft-reconfiguration inbound'\n"
380 #define BGP_SOFT_OUT_STR "Resend all outbound updates\n"
381 #define BGP_SOFT_RSCLIENT_RIB_STR "Soft reconfig for rsclient RIB\n"
382 #define OSPF_STR "OSPF information\n"
383 #define NEIGHBOR_STR "Specify neighbor router\n"
384 #define DEBUG_STR "Debugging functions\n"
385 #define UNDEBUG_STR "Disable debugging functions (see also 'debug')\n"
386 #define ROUTER_STR "Enable a routing process\n"
387 #define AS_STR "AS number\n"
388 #define MAC_STR "MAC address\n"
389 #define MBGP_STR "MBGP information\n"
390 #define MATCH_STR "Match values from routing table\n"
391 #define SET_STR "Set values in destination routing protocol\n"
392 #define OUT_STR "Filter outgoing routing updates\n"
393 #define IN_STR "Filter incoming routing updates\n"
394 #define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0)\n"
395 #define OSPF6_NUMBER_STR "Specify by number\n"
396 #define INTERFACE_STR "Interface information\n"
397 #define IFNAME_STR "Interface name(e.g. ep0)\n"
398 #define IP6_STR "IPv6 Information\n"
399 #define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6\n"
400 #define OSPF6_INSTANCE_STR "(1-65535) Instance ID\n"
401 #define SECONDS_STR "Seconds\n"
402 #define ROUTE_STR "Routing Table\n"
403 #define PREFIX_LIST_STR "Build a prefix list\n"
404 #define OSPF6_DUMP_TYPE_LIST \
405 "<neighbor|interface|area|lsa|zebra|config|dbex|spf|route|lsdb|redistribute|hook|asbr|prefix|abr>"
406 #define AREA_TAG_STR "[area tag]\n"
407 #define COMMUNITY_AANN_STR "Community number where AA and NN are (0-65535)\n"
408 #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"
409 #define MPLS_TE_STR "MPLS-TE specific commands\n"
410 #define LINK_PARAMS_STR "Configure interface link parameters\n"
411 #define OSPF_RI_STR "OSPF Router Information specific commands\n"
412 #define PCE_STR "PCE Router Information specific commands\n"
413 #define MPLS_STR "MPLS information\n"
414 #define SR_STR "Segment-Routing specific commands\n"
415 #define WATCHFRR_STR "watchfrr information\n"
416 #define ZEBRA_STR "Zebra information\n"
417 #define FILTER_LOG_STR "Filter Logs\n"
418 #define BFD_PROFILE_STR "BFD profile.\n"
419 #define BFD_PROFILE_NAME_STR "BFD profile name.\n"
420 #define SHARP_STR "Sharp Routing Protocol\n"
421
422 #define CMD_VNI_RANGE "(1-16777215)"
423 #define CONF_BACKUP_EXT ".sav"
424 #define MPLS_LDP_SYNC_STR "Enable MPLS LDP-SYNC\n"
425 #define NO_MPLS_LDP_SYNC_STR "Disable MPLS LDP-SYNC\n"
426 #define MPLS_LDP_SYNC_HOLDDOWN_STR \
427 "Time to wait for LDP-SYNC to occur before restoring if cost\n"
428 #define NO_MPLS_LDP_SYNC_HOLDDOWN_STR "holddown timer disable\n"
429
430 /* Command warnings. */
431 #define NO_PASSWD_CMD_WARNING \
432 "Please be aware that removing the password is a security risk and you should think twice about this command.\n"
433
434 /* IPv4 only machine should not accept IPv6 address for peer's IP
435 address. So we replace VTY command string like below. */
436 #define NEIGHBOR_ADDR_STR "Neighbor address\nIPv6 address\n"
437 #define NEIGHBOR_ADDR_STR2 "Neighbor address\nNeighbor IPv6 address\nInterface name or neighbor tag\n"
438 #define NEIGHBOR_ADDR_STR3 "Neighbor address\nIPv6 address\nInterface name\n"
439
440 /* Daemons lists */
441 #define DAEMONS_STR \
442 "For the zebra daemon\nFor the rip daemon\nFor the ripng daemon\nFor the ospf daemon\nFor the ospfv6 daemon\nFor the bgp daemon\nFor the isis daemon\nFor the pbr daemon\nFor the fabricd daemon\nFor the pim daemon\nFor the static daemon\nFor the sharpd daemon\nFor the vrrpd daemon\nFor the ldpd daemon\n"
443 #define DAEMONS_LIST \
444 "<zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|pbrd|fabricd|pimd|staticd|sharpd|vrrpd|ldpd>"
445
446 /* Graceful Restart cli help strings */
447 #define GR_CMD "Global Graceful Restart command\n"
448 #define NO_GR_CMD "Undo Global Graceful Restart command\n"
449 #define GR "Global Graceful Restart - GR Mode\n"
450 #define GR_DISABLE "Global Graceful Restart - Disable Mode\n"
451 #define NO_GR_DISABLE "Undo Global Graceful Restart - Disable Mode\n"
452 #define GR_DEBUG "Graceful Restart - Enable Debug Logs\n"
453 #define GR_SHOW "Graceful Restart - Show command for Global and all neighbor mode\n"
454 #define GR_NEIGHBOR_CMD "Graceful Restart command for a neighbor\n"
455 #define NO_GR_NEIGHBOR_CMD "Undo Graceful Restart command for a neighbor\n"
456 #define GR_NEIGHBOR_DISABLE_CMD "Graceful Restart Disable command for a neighbor\n"
457 #define NO_GR_NEIGHBOR_DISABLE_CMD "Undo Graceful Restart Disable command for a neighbor\n"
458 #define GR_NEIGHBOR_HELPER_CMD "Graceful Restart Helper command for a neighbor\n"
459 #define NO_GR_NEIGHBOR_HELPER_CMD "Undo Graceful Restart Helper command for a neighbor\n"
460
461 /* Prototypes. */
462 extern void install_node(struct cmd_node *node);
463 extern void install_default(enum node_type);
464 extern void install_element(enum node_type, const struct cmd_element *);
465
466 /* known issue with uninstall_element: changes to cmd_token->attr (i.e.
467 * deprecated/hidden) are not reversed. */
468 extern void uninstall_element(enum node_type, const struct cmd_element *);
469
470 /* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
471 string with a space between each element (allocated using
472 XMALLOC(MTYPE_TMP)). Returns NULL if shift >= argc. */
473 extern char *argv_concat(struct cmd_token **argv, int argc, int shift);
474
475 /*
476 * It is preferred that you set the index initial value
477 * to a 0. This way in the future if you modify the
478 * cli then there is no need to modify the initial
479 * value of the index
480 */
481 extern int argv_find(struct cmd_token **argv, int argc, const char *text,
482 int *index);
483
484 extern vector cmd_make_strvec(const char *);
485 extern void cmd_free_strvec(vector);
486 extern vector cmd_describe_command(vector, struct vty *, int *status);
487 extern char **cmd_complete_command(vector, struct vty *, int *status);
488 extern const char *cmd_prompt(enum node_type);
489 extern int command_config_read_one_line(struct vty *vty,
490 const struct cmd_element **,
491 uint32_t line_num, int use_config_node);
492 extern int config_from_file(struct vty *, FILE *, unsigned int *line_num);
493 extern enum node_type node_parent(enum node_type);
494 /*
495 * Execute command under the given vty context.
496 *
497 * vty
498 * The vty context to execute under.
499 *
500 * cmd
501 * The command string to execute.
502 *
503 * matched
504 * If non-null and a match was found, the address of the matched command is
505 * stored here. No action otherwise.
506 *
507 * vtysh
508 * Whether or not this is being called from vtysh. If this is nonzero,
509 * XXX: then what?
510 *
511 * Returns:
512 * XXX: what does it return
513 */
514 extern int cmd_execute(struct vty *vty, const char *cmd,
515 const struct cmd_element **matched, int vtysh);
516 extern int cmd_execute_command(vector, struct vty *,
517 const struct cmd_element **, int);
518 extern int cmd_execute_command_strict(vector, struct vty *,
519 const struct cmd_element **);
520 extern void cmd_init(int);
521 extern void cmd_terminate(void);
522 extern void cmd_exit(struct vty *vty);
523 extern int cmd_list_cmds(struct vty *vty, int do_permute);
524
525 extern int cmd_domainname_set(const char *domainname);
526 extern int cmd_hostname_set(const char *hostname);
527 extern const char *cmd_hostname_get(void);
528 extern const char *cmd_domainname_get(void);
529
530 /* NOT safe for general use; call this only if DEV_BUILD! */
531 extern void grammar_sandbox_init(void);
532
533 extern vector completions_to_vec(struct list *completions);
534
535 /* Export typical functions. */
536 extern const char *host_config_get(void);
537 extern void host_config_set(const char *);
538
539 extern void print_version(const char *);
540
541 extern int cmd_banner_motd_file(const char *);
542 extern void cmd_banner_motd_line(const char *line);
543
544 /* struct host global, ick */
545 extern struct host host;
546
547 struct cmd_variable_handler {
548 const char *tokenname, *varname;
549 void (*completions)(vector out, struct cmd_token *token);
550 };
551
552 extern void cmd_variable_complete(struct cmd_token *token, const char *arg,
553 vector comps);
554 extern void
555 cmd_variable_handler_register(const struct cmd_variable_handler *cvh);
556 extern char *cmd_variable_comp2str(vector comps, unsigned short cols);
557
558 extern void command_setup_early_logging(const char *dest, const char *level);
559
560 #ifdef __cplusplus
561 }
562 #endif
563
564 #endif /* _ZEBRA_COMMAND_H */