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