1 /*
2  * CLI graph handling
3  *
4  * --
5  * Copyright (C) 2016 Cumulus Networks, Inc.
6  * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
7  * Copyright (C) 2013 by Open Source Routing.
8  * Copyright (C) 2013 by Internet Systems Consortium, Inc. ("ISC")
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU General Public License as published by the Free
12  * Software Foundation; either version 2 of the License, or (at your option)
13  * any later version.
14  *
15  * This program is distributed in the hope that it will be useful, but WITHOUT
16  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
18  * more details.
19  *
20  * You should have received a copy of the GNU General Public License along
21  * with this program; see the file COPYING; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 #ifndef _FRR_COMMAND_GRAPH_H
26 #define _FRR_COMMAND_GRAPH_H
27 
28 #include <stdbool.h>
29 #include <stdint.h>
30 
31 #include "memory.h"
32 #include "vector.h"
33 #include "graph.h"
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 DECLARE_MTYPE(CMD_ARG)
40 
41 struct vty;
42 
43 /**
44  * Types for tokens.
45  *
46  * The type determines what kind of data the token can match (in the
47  * matching use case) or hold (in the argv use case).
48  */
49 /* clang-format off */
50 enum cmd_token_type {
51 	WORD_TKN,        // words
52 	VARIABLE_TKN,    // almost anything
53 	RANGE_TKN,       // integer range
54 	IPV4_TKN,        // IPV4 addresses
55 	IPV4_PREFIX_TKN, // IPV4 network prefixes
56 	IPV6_TKN,        // IPV6 prefixes
57 	IPV6_PREFIX_TKN, // IPV6 network prefixes
58 	MAC_TKN,         // Ethernet address
59 	MAC_PREFIX_TKN,  // Ethernet address w/ CIDR mask
60 
61 	/* plumbing types */
62 	FORK_TKN,  // marks subgraph beginning
63 	JOIN_TKN,  // marks subgraph end
64 	START_TKN, // first token in line
65 	END_TKN,   // last token in line
66 
67 	SPECIAL_TKN = FORK_TKN,
68 };
69 /* clang-format on */
70 
71 #define IS_VARYING_TOKEN(x) ((x) >= VARIABLE_TKN && (x) < FORK_TKN)
72 
73 /* Command attributes */
74 enum { CMD_ATTR_NORMAL,
75        CMD_ATTR_DEPRECATED,
76        CMD_ATTR_HIDDEN,
77        CMD_ATTR_YANG,
78 };
79 
80 /* Comamand token struct. */
81 struct cmd_token {
82 	enum cmd_token_type type; // token type
83 	uint8_t attr;		  // token attributes
84 	bool allowrepeat;	 // matcher allowed to match token repetively?
85 	uint32_t refcnt;
86 
87 	char *text;	 // token text
88 	char *desc;	 // token description
89 	long long min, max; // for ranges
90 	char *arg;	  // user input that matches this token
91 	char *varname;
92 
93 	struct graph_node *forkjoin; // paired FORK/JOIN for JOIN/FORK
94 };
95 
96 /* Structure of command element. */
97 struct cmd_element {
98 	const char *string; /* Command specification by string. */
99 	const char *doc;    /* Documentation of this command. */
100 	int daemon;	 /* Daemon to which this command belong. */
101 	uint8_t attr;       /* Command attributes */
102 
103 	/* handler function for command */
104 	int (*func)(const struct cmd_element *, struct vty *, int,
105 		    struct cmd_token *[]);
106 
107 	const char *name; /* symbol name for debugging */
108 };
109 
110 /* text for <cr> command */
111 #define CMD_CR_TEXT "<cr>"
112 
113 /* memory management for cmd_token */
114 extern struct cmd_token *cmd_token_new(enum cmd_token_type, uint8_t attr,
115 				       const char *text, const char *desc);
116 extern struct cmd_token *cmd_token_dup(struct cmd_token *);
117 extern void cmd_token_del(struct cmd_token *);
118 extern void cmd_token_varname_set(struct cmd_token *token, const char *varname);
119 
120 extern void cmd_graph_parse(struct graph *graph, const struct cmd_element *cmd);
121 extern void cmd_graph_names(struct graph *graph);
122 extern void cmd_graph_merge(struct graph *old, struct graph *n,
123 			    int direction);
124 /*
125  * Print callback for DOT dumping.
126  *
127  * See graph.h for more details.
128  */
129 extern void cmd_graph_node_print_cb(struct graph_node *gn, struct buffer *buf);
130 /*
131  * Dump command graph to DOT.
132  *
133  * cmdgraph
134  *    A command graph to dump
135  *
136  * Returns:
137  *    String allocated with MTYPE_TMP representing this graph
138  */
139 char *cmd_graph_dump_dot(struct graph *cmdgraph);
140 
141 #ifdef __cplusplus
142 }
143 #endif
144 
145 #endif /* _FRR_COMMAND_GRAPH_H */
146