Project

General

Profile

Download (12.4 KB) Statistics
| Branch: | Tag: | Revision:
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

    
23
#ifndef _ZEBRA_COMMAND_H
24
#define _ZEBRA_COMMAND_H
25

    
26
#include <stdio.h>
27
#include "vector.h"
28
#include "vty.h"
29

    
30
/* Host configuration variable */
31
struct host {
32
	/* Host name of this router. */
33
	char *name;
34

    
35
	/* Password for vty interface. */
36
	char *password;
37
	char *password_encrypt;
38

    
39
	/* Enable password */
40
	char *enable;
41
	char *enable_encrypt;
42

    
43
	/* System wide terminal lines. */
44
	int lines;
45

    
46
	/* Log filename. */
47
	char *logfile;
48

    
49
	/* config file name of this host */
50
	char *config;
51

    
52
	/* Flags for services */
53
	int advanced;
54
	int encrypt;
55

    
56
	/* Banner configuration. */
57
	const char *motd;
58
	char *motdfile;
59
};
60

    
61
/* There are some command levels which called from command node. */
62
enum node_type {
63
	RC632_NODE,
64

    
65
	AUTH_NODE,		/* Authentication mode of vty interface. */
66
	VIEW_NODE,		/* View node. Default mode of vty interface. */
67
	AUTH_ENABLE_NODE,	/* Authentication mode for change enable. */
68
	ENABLE_NODE,		/* Enable node. */
69
	CONFIG_NODE,		/* Config node. Default mode of config file. */
70
	SERVICE_NODE,		/* Service node. */
71
	DEBUG_NODE,		/* Debug node. */
72
	AAA_NODE,		/* AAA node. */
73
	KEYCHAIN_NODE,		/* Key-chain node. */
74
	KEYCHAIN_KEY_NODE,	/* Key-chain key node. */
75
	INTERFACE_NODE,		/* Interface mode node. */
76
	ZEBRA_NODE,		/* zebra connection node. */
77
	TABLE_NODE,		/* rtm_table selection node. */
78
	RIP_NODE,		/* RIP protocol mode node. */
79
	RIPNG_NODE,		/* RIPng protocol mode node. */
80
	BGP_NODE,		/* BGP protocol mode which includes BGP4+ */
81
	BGP_VPNV4_NODE,		/* BGP MPLS-VPN PE exchange. */
82
	BGP_IPV4_NODE,		/* BGP IPv4 unicast address family.  */
83
	BGP_IPV4M_NODE,		/* BGP IPv4 multicast address family.  */
84
	BGP_IPV6_NODE,		/* BGP IPv6 address family */
85
	OSPF_NODE,		/* OSPF protocol mode */
86
	OSPF6_NODE,		/* OSPF protocol for IPv6 mode */
87
	ISIS_NODE,		/* ISIS protocol mode */
88
	MASC_NODE,		/* MASC for multicast.  */
89
	IRDP_NODE,		/* ICMP Router Discovery Protocol mode. */
90
	IP_NODE,		/* Static ip route node. */
91
	ACCESS_NODE,		/* Access list node. */
92
	PREFIX_NODE,		/* Prefix list node. */
93
	ACCESS_IPV6_NODE,	/* Access list node. */
94
	PREFIX_IPV6_NODE,	/* Prefix list node. */
95
	AS_LIST_NODE,		/* AS list node. */
96
	COMMUNITY_LIST_NODE,	/* Community list node. */
97
	RMAP_NODE,		/* Route map node. */
98
	SMUX_NODE,		/* SNMP configuration node. */
99
	DUMP_NODE,		/* Packet dump node. */
100
	FORWARDING_NODE,	/* IP forwarding node. */
101
	VTY_NODE		/* Vty node. */
102
};
103

    
104
/* Node which has some commands and prompt string and configuration
105
   function pointer . */
106
struct cmd_node {
107
	/* Node index. */
108
	enum node_type node;
109

    
110
	/* Prompt character at vty interface. */
111
	const char *prompt;
112

    
113
	/* Is this node's configuration goes to vtysh ? */
114
	int vtysh;
115

    
116
	/* Node's configuration write function */
117
	int (*func) (struct vty *);
118

    
119
	/* Vector of this node's command list. */
120
	vector cmd_vector;
121
};
122

    
123
enum {
124
	CMD_ATTR_DEPRECATED = 1,
125
	CMD_ATTR_HIDDEN,
126
};
127

    
128
/* Structure of command element. */
129
struct cmd_element {
130
	const char *string;	/* Command specification by string. */
131
	int (*func) (struct cmd_element *, struct vty *, int, const char *[]);
132
	const char *doc;	/* Documentation of this command. */
133
	int daemon;		/* Daemon to which this command belong. */
134
	vector strvec;		/* Pointing out each description vector. */
135
	unsigned int cmdsize;	/* Command index count. */
136
	char *config;		/* Configuration string */
137
	vector subconfig;	/* Sub configuration string */
138
	u_char attr;		/* Command attributes */
139
};
140

    
141
/* Command description structure. */
142
struct desc {
143
	const char *cmd;	/* Command string. */
144
	const char *str;	/* Command's description. */
145
};
146

    
147
/* Return value of the commands. */
148
#define CMD_SUCCESS              0
149
#define CMD_WARNING              1
150
#define CMD_ERR_NO_MATCH         2
151
#define CMD_ERR_AMBIGUOUS        3
152
#define CMD_ERR_INCOMPLETE       4
153
#define CMD_ERR_EXEED_ARGC_MAX   5
154
#define CMD_ERR_NOTHING_TODO     6
155
#define CMD_COMPLETE_FULL_MATCH  7
156
#define CMD_COMPLETE_MATCH       8
157
#define CMD_COMPLETE_LIST_MATCH  9
158
#define CMD_SUCCESS_DAEMON      10
159

    
160
/* Argc max counts. */
161
#define CMD_ARGC_MAX   25
162

    
163
/* Turn off these macros when uisng cpp with extract.pl */
164
#ifndef VTYSH_EXTRACT_PL
165

    
166
/* helper defines for end-user DEFUN* macros */
167
#define DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attrs, dnum) \
168
  struct cmd_element cmdname = \
169
  { \
170
    .string = cmdstr, \
171
    .func = funcname, \
172
    .doc = helpstr, \
173
    .attr = attrs, \
174
    .daemon = dnum, \
175
  };
176

    
177
#define DEFUN_CMD_FUNC_DECL(funcname) \
178
  static int funcname (struct cmd_element *, struct vty *, int, const char *[]); \
179

    
180
#define DEFUN_CMD_FUNC_TEXT(funcname) \
181
  static int funcname \
182
    (struct cmd_element *self, struct vty *vty, int argc, const char *argv[])
183

    
184
/* DEFUN for vty command interafce. Little bit hacky ;-). */
185
#define DEFUN(funcname, cmdname, cmdstr, helpstr) \
186
  DEFUN_CMD_FUNC_DECL(funcname) \
187
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) \
188
  DEFUN_CMD_FUNC_TEXT(funcname)
189

    
190
#define DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
191
  DEFUN_CMD_FUNC_DECL(funcname) \
192
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0) \
193
  DEFUN_CMD_FUNC_TEXT(funcname)
194

    
195
#define DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
196
  DEFUN_ATTR (funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
197

    
198
#define DEFUN_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
199
  DEFUN_ATTR (funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED) \
200

    
201
/* DEFUN_NOSH for commands that vtysh should ignore */
202
#define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) \
203
  DEFUN(funcname, cmdname, cmdstr, helpstr)
204

    
205
/* DEFSH for vtysh. */
206
#define DEFSH(daemon, cmdname, cmdstr, helpstr) \
207
  DEFUN_CMD_ELEMENT(NULL, cmdname, cmdstr, helpstr, 0, daemon) \
208

    
209
/* DEFUN + DEFSH */
210
#define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
211
  DEFUN_CMD_FUNC_DECL(funcname) \
212
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
213
  DEFUN_CMD_FUNC_TEXT(funcname)
214

    
215
/* DEFUN + DEFSH with attributes */
216
#define DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, attr) \
217
  DEFUN_CMD_FUNC_DECL(funcname) \
218
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
219
  DEFUN_CMD_FUNC_TEXT(funcname)
220

    
221
#define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
222
  DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
223

    
224
#define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
225
  DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED)
226

    
227
/* ALIAS macro which define existing command's alias. */
228
#define ALIAS(funcname, cmdname, cmdstr, helpstr) \
229
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
230

    
231
#define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
232
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
233

    
234
#define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
235
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, 0)
236

    
237
#define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
238
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, 0)
239

    
240
#define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr) \
241
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
242

    
243
#define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
244
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, daemon)
245

    
246
#define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
247
  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, daemon)
248

    
249
#endif				/* VTYSH_EXTRACT_PL */
250

    
251
/* Some macroes */
252
#define CMD_OPTION(S)   ((S[0]) == '[')
253
#define CMD_VARIABLE(S) (((S[0]) >= 'A' && (S[0]) <= 'Z') || ((S[0]) == '<'))
254
#define CMD_VARARG(S)   ((S[0]) == '.')
255
#define CMD_RANGE(S)	((S[0] == '<'))
256

    
257
#define CMD_IPV4(S)	   ((strcmp ((S), "A.B.C.D") == 0))
258
#define CMD_IPV4_PREFIX(S) ((strcmp ((S), "A.B.C.D/M") == 0))
259
#define CMD_IPV6(S)        ((strcmp ((S), "X:X::X:X") == 0))
260
#define CMD_IPV6_PREFIX(S) ((strcmp ((S), "X:X::X:X/M") == 0))
261

    
262
/* Common descriptions. */
263
#define SHOW_STR "Show running system information\n"
264
#define IP_STR "IP information\n"
265
#define IPV6_STR "IPv6 information\n"
266
#define NO_STR "Negate a command or set its defaults\n"
267
#define CLEAR_STR "Reset functions\n"
268
#define RIP_STR "RIP information\n"
269
#define BGP_STR "BGP information\n"
270
#define OSPF_STR "OSPF information\n"
271
#define NEIGHBOR_STR "Specify neighbor router\n"
272
#define DEBUG_STR "Debugging functions (see also 'undebug')\n"
273
#define UNDEBUG_STR "Disable debugging functions (see also 'debug')\n"
274
#define ROUTER_STR "Enable a routing process\n"
275
#define AS_STR "AS number\n"
276
#define MBGP_STR "MBGP information\n"
277
#define MATCH_STR "Match values from routing table\n"
278
#define SET_STR "Set values in destination routing protocol\n"
279
#define OUT_STR "Filter outgoing routing updates\n"
280
#define IN_STR  "Filter incoming routing updates\n"
281
#define V4NOTATION_STR "specify by IPv4 address notation(e.g. 0.0.0.0)\n"
282
#define OSPF6_NUMBER_STR "Specify by number\n"
283
#define INTERFACE_STR "Interface infomation\n"
284
#define IFNAME_STR "Interface name(e.g. ep0)\n"
285
#define IP6_STR "IPv6 Information\n"
286
#define OSPF6_STR "Open Shortest Path First (OSPF) for IPv6\n"
287
#define OSPF6_ROUTER_STR "Enable a routing process\n"
288
#define OSPF6_INSTANCE_STR "<1-65535> Instance ID\n"
289
#define SECONDS_STR "<1-65535> Seconds\n"
290
#define ROUTE_STR "Routing Table\n"
291
#define PREFIX_LIST_STR "Build a prefix list\n"
292
#define OSPF6_DUMP_TYPE_LIST \
293
"(neighbor|interface|area|lsa|zebra|config|dbex|spf|route|lsdb|redistribute|hook|asbr|prefix|abr)"
294
#define ISIS_STR "IS-IS information\n"
295
#define AREA_TAG_STR "[area tag]\n"
296

    
297
#define CONF_BACKUP_EXT ".sav"
298

    
299
/* IPv4 only machine should not accept IPv6 address for peer's IP
300
   address.  So we replace VTY command string like below. */
301
#ifdef HAVE_IPV6
302
#define NEIGHBOR_CMD       "neighbor (A.B.C.D|X:X::X:X) "
303
#define NO_NEIGHBOR_CMD    "no neighbor (A.B.C.D|X:X::X:X) "
304
#define NEIGHBOR_ADDR_STR  "Neighbor address\nIPv6 address\n"
305
#define NEIGHBOR_CMD2      "neighbor (A.B.C.D|X:X::X:X|WORD) "
306
#define NO_NEIGHBOR_CMD2   "no neighbor (A.B.C.D|X:X::X:X|WORD) "
307
#define NEIGHBOR_ADDR_STR2 "Neighbor address\nNeighbor IPv6 address\nNeighbor tag\n"
308
#else
309
#define NEIGHBOR_CMD       "neighbor A.B.C.D "
310
#define NO_NEIGHBOR_CMD    "no neighbor A.B.C.D "
311
#define NEIGHBOR_ADDR_STR  "Neighbor address\n"
312
#define NEIGHBOR_CMD2      "neighbor (A.B.C.D|WORD) "
313
#define NO_NEIGHBOR_CMD2   "no neighbor (A.B.C.D|WORD) "
314
#define NEIGHBOR_ADDR_STR2 "Neighbor address\nNeighbor tag\n"
315
#endif				/* HAVE_IPV6 */
316

    
317
/* Prototypes. */
318
void install_node(struct cmd_node *, int (*)(struct vty *));
319
void install_default(enum node_type);
320
void install_element(enum node_type, struct cmd_element *);
321
void sort_node();
322

    
323
/* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
324
   string with a space between each element (allocated using
325
   XMALLOC(MTYPE_TMP)).  Returns NULL if shift >= argc. */
326
char *argv_concat(const char **argv, int argc, int shift);
327

    
328
vector cmd_make_strvec(const char *);
329
void cmd_free_strvec(vector);
330
vector cmd_describe_command();
331
char **cmd_complete_command();
332
const char *cmd_prompt(enum node_type);
333
int config_from_file(struct vty *, FILE *);
334
enum node_type node_parent(enum node_type);
335
int cmd_execute_command(vector, struct vty *, struct cmd_element **, int);
336
int cmd_execute_command_strict(vector, struct vty *, struct cmd_element **);
337
void config_replace_string(struct cmd_element *, char *, ...);
338
void cmd_init(int);
339

    
340
/* Export typical functions. */
341
extern struct cmd_element config_end_cmd;
342
extern struct cmd_element config_exit_cmd;
343
extern struct cmd_element config_quit_cmd;
344
extern struct cmd_element config_help_cmd;
345
extern struct cmd_element config_list_cmd;
346
char *host_config_file();
347
void host_config_set(char *);
348

    
349
void print_version(const char *);
350

    
351
#endif				/* _ZEBRA_COMMAND_H */
(5-5/10)
Add picture from clipboard (Maximum size: 48.8 MB)