1998-11-28 03:35:10 +08:00
|
|
|
/*
|
|
|
|
* BIRD Internet Routing Daemon -- Configuration File Handling
|
|
|
|
*
|
2000-01-17 00:44:50 +08:00
|
|
|
* (c) 1998--2000 Martin Mares <mj@ucw.cz>
|
1998-11-28 03:35:10 +08:00
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BIRD_CONF_H_
|
|
|
|
#define _BIRD_CONF_H_
|
|
|
|
|
2016-11-09 23:36:34 +08:00
|
|
|
#include "sysdep/config.h"
|
|
|
|
#include "lib/ip.h"
|
2017-05-26 05:30:39 +08:00
|
|
|
#include "lib/hash.h"
|
1998-11-28 03:35:10 +08:00
|
|
|
#include "lib/resource.h"
|
2017-11-29 00:43:20 +08:00
|
|
|
#include "lib/timer.h"
|
1998-11-28 03:35:10 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
/* Configuration structure */
|
|
|
|
|
|
|
|
struct config {
|
|
|
|
pool *pool; /* Pool the configuration is stored in */
|
|
|
|
linpool *mem; /* Linear pool containing configuration data */
|
|
|
|
list protos; /* Configured protocol instances (struct proto_config) */
|
1999-05-18 04:06:19 +08:00
|
|
|
list tables; /* Configured routing tables (struct rtable_config) */
|
2016-11-09 00:46:29 +08:00
|
|
|
list logfiles; /* Configured log files (sysdep) */
|
2016-11-30 17:21:43 +08:00
|
|
|
list tests; /* Configured unit tests (f_bt_test_suite) */
|
2019-02-26 23:44:24 +08:00
|
|
|
list symbols; /* Configured symbols in config order */
|
2012-03-19 00:32:30 +08:00
|
|
|
|
2010-01-03 19:17:52 +08:00
|
|
|
int mrtdump_file; /* Configured MRTDump file (sysdep, fd in unix) */
|
2020-04-09 04:25:15 +08:00
|
|
|
const char *syslog_name; /* Name used for syslog (NULL -> no syslog) */
|
2016-01-26 18:48:58 +08:00
|
|
|
struct rtable_config *def_tables[NET_MAX]; /* Default routing tables for each network */
|
2012-12-27 19:56:23 +08:00
|
|
|
struct iface_patt *router_id_from; /* Configured list of router ID iface patterns */
|
2010-01-03 19:17:52 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
u32 router_id; /* Our Router ID */
|
2020-12-08 05:19:40 +08:00
|
|
|
u32 proto_default_debug; /* Default protocol debug mask */
|
|
|
|
u32 proto_default_mrtdump; /* Default protocol mrtdump mask */
|
|
|
|
u32 channel_default_debug; /* Default channel debug mask */
|
2021-08-26 04:20:48 +08:00
|
|
|
u16 filter_vstk, filter_estk; /* Filter stack depth */
|
2010-02-03 07:19:24 +08:00
|
|
|
struct timeformat tf_route; /* Time format for 'show route' */
|
|
|
|
struct timeformat tf_proto; /* Time format for 'show protocol' */
|
|
|
|
struct timeformat tf_log; /* Time format for the logfile */
|
|
|
|
struct timeformat tf_base; /* Time format for other purposes */
|
2017-06-21 20:43:49 +08:00
|
|
|
u32 gr_wait; /* Graceful restart wait timeout (sec) */
|
2021-02-10 23:53:57 +08:00
|
|
|
const char *hostname; /* Hostname */
|
2010-02-03 07:19:24 +08:00
|
|
|
|
2000-05-30 06:10:18 +08:00
|
|
|
int cli_debug; /* Tracing of CLI connections and commands */
|
2015-03-02 16:41:14 +08:00
|
|
|
int latency_debug; /* I/O loop tracks duration of each event */
|
|
|
|
u32 latency_limit; /* Events with longer duration are logged (us) */
|
|
|
|
u32 watchdog_warning; /* I/O loop watchdog limit for warning (us) */
|
|
|
|
u32 watchdog_timeout; /* Watchdog timeout (in seconds, 0 = disabled) */
|
1999-02-06 05:37:34 +08:00
|
|
|
char *err_msg; /* Parser error message */
|
|
|
|
int err_lino; /* Line containing error */
|
2018-09-11 22:55:41 +08:00
|
|
|
int err_chno; /* Character where the parser stopped */
|
2011-09-12 03:21:47 +08:00
|
|
|
char *err_file_name; /* File name containing error */
|
|
|
|
char *file_name; /* Name of main configuration file */
|
|
|
|
int file_fd; /* File descriptor of main configuration file */
|
2017-05-26 05:30:39 +08:00
|
|
|
HASH(struct symbol) sym_hash; /* Lexer: symbol hash table */
|
|
|
|
struct config *fallback; /* Link to regular config for CLI parsing */
|
2019-04-08 23:05:07 +08:00
|
|
|
struct sym_scope *root_scope; /* Scope for root symbols */
|
2000-01-17 00:44:50 +08:00
|
|
|
int obstacle_count; /* Number of items blocking freeing of this config */
|
2000-01-17 01:40:26 +08:00
|
|
|
int shutdown; /* This is a pseudo-config for daemon shutdown */
|
2019-06-18 22:27:21 +08:00
|
|
|
int gr_down; /* This is a pseudo-config for graceful restart */
|
2017-06-06 22:47:30 +08:00
|
|
|
btime load_time; /* When we've got this configuration */
|
1999-02-06 05:37:34 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Please don't use these variables in protocols. Use proto_config->global instead. */
|
2000-01-17 00:44:50 +08:00
|
|
|
extern struct config *config; /* Currently active configuration */
|
|
|
|
extern struct config *new_config; /* Configuration being parsed */
|
2000-01-17 01:40:26 +08:00
|
|
|
|
2016-11-09 23:36:34 +08:00
|
|
|
struct config *config_alloc(const char *name);
|
1999-02-06 05:37:34 +08:00
|
|
|
int config_parse(struct config *);
|
Parse CLI commands. We use the same parser as for configuration files (because
we want to allow filter and similar complex constructs to be used in commands
and we should avoid code duplication), only with CLI_MARKER token prepended
before the whole input.
Defined macro CF_CLI(cmd, args, help) for defining CLI commands in .Y files.
The first argument specifies the command itself, the remaining two arguments
are copied to the help file (er, will be copied after the help file starts
to exist). This macro automatically creates a skeleton rule for the command,
you only need to append arguments as in:
CF_CLI(STEAL MONEY, <$>, [[Steal <$> US dollars or equivalent in any other currency]]): NUM {
cli_msg(0, "%d$ stolen", $3);
} ;
Also don't forget to reset lexer state between inputs.
1999-11-01 01:47:47 +08:00
|
|
|
int cli_parse(struct config *);
|
1999-02-06 05:37:34 +08:00
|
|
|
void config_free(struct config *);
|
2017-06-21 20:43:49 +08:00
|
|
|
int config_commit(struct config *, int type, uint timeout);
|
2012-12-26 19:40:48 +08:00
|
|
|
int config_confirm(void);
|
|
|
|
int config_undo(void);
|
2019-06-12 22:13:21 +08:00
|
|
|
int config_status(void);
|
|
|
|
btime config_timer_status(void);
|
2012-12-26 19:40:48 +08:00
|
|
|
void config_init(void);
|
2016-03-09 23:48:28 +08:00
|
|
|
void cf_error(const char *msg, ...) NORET;
|
2000-01-17 00:44:50 +08:00
|
|
|
void config_add_obstacle(struct config *);
|
|
|
|
void config_del_obstacle(struct config *);
|
2019-06-18 22:27:21 +08:00
|
|
|
void order_shutdown(int gr);
|
2000-01-17 00:44:50 +08:00
|
|
|
|
2012-12-26 19:40:48 +08:00
|
|
|
#define RECONFIG_NONE 0
|
|
|
|
#define RECONFIG_HARD 1
|
|
|
|
#define RECONFIG_SOFT 2
|
|
|
|
#define RECONFIG_UNDO 3
|
|
|
|
|
|
|
|
#define CONF_DONE 0
|
|
|
|
#define CONF_PROGRESS 1
|
|
|
|
#define CONF_QUEUED 2
|
|
|
|
#define CONF_UNQUEUED 3
|
|
|
|
#define CONF_CONFIRM 4
|
|
|
|
#define CONF_SHUTDOWN -1
|
|
|
|
#define CONF_NOTHING -2
|
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
|
1998-11-30 05:59:37 +08:00
|
|
|
/* Pools */
|
|
|
|
|
1998-12-06 19:59:18 +08:00
|
|
|
extern linpool *cfg_mem;
|
1998-11-28 03:35:10 +08:00
|
|
|
|
1998-12-06 19:59:18 +08:00
|
|
|
#define cfg_alloc(size) lp_alloc(cfg_mem, size)
|
|
|
|
#define cfg_allocu(size) lp_allocu(cfg_mem, size)
|
|
|
|
#define cfg_allocz(size) lp_allocz(cfg_mem, size)
|
2016-11-09 00:46:29 +08:00
|
|
|
char *cfg_strdup(const char *c);
|
2011-11-07 07:31:23 +08:00
|
|
|
void cfg_copy_list(list *dest, list *src, unsigned node_size);
|
1998-11-30 05:59:37 +08:00
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
/* Lexer */
|
|
|
|
|
2015-05-19 14:53:34 +08:00
|
|
|
extern int (*cf_read_hook)(byte *buf, uint max, int fd);
|
1998-11-28 03:35:10 +08:00
|
|
|
|
|
|
|
struct symbol {
|
2019-02-26 23:44:24 +08:00
|
|
|
node n; /* In list of symbols in config */
|
1998-11-28 03:35:10 +08:00
|
|
|
struct symbol *next;
|
1999-11-04 21:51:52 +08:00
|
|
|
struct sym_scope *scope;
|
2019-02-15 20:53:17 +08:00
|
|
|
int class; /* SYM_* */
|
|
|
|
uint flags; /* SYM_FLAG_* */
|
|
|
|
|
|
|
|
union {
|
|
|
|
struct proto_config *proto; /* For SYM_PROTO and SYM_TEMPLATE */
|
|
|
|
const struct f_line *function; /* For SYM_FUNCTION */
|
|
|
|
const struct filter *filter; /* For SYM_FILTER */
|
|
|
|
struct rtable_config *table; /* For SYM_TABLE */
|
|
|
|
struct f_dynamic_attr *attribute; /* For SYM_ATTRIBUTE */
|
2019-05-22 00:33:37 +08:00
|
|
|
struct f_val *val; /* For SYM_CONSTANT */
|
|
|
|
uint offset; /* For SYM_VARIABLE */
|
2019-02-15 20:53:17 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
char name[0];
|
1998-11-28 03:35:10 +08:00
|
|
|
};
|
|
|
|
|
2017-05-26 05:30:39 +08:00
|
|
|
struct sym_scope {
|
|
|
|
struct sym_scope *next; /* Next on scope stack */
|
|
|
|
struct symbol *name; /* Name of this scope */
|
2019-06-25 22:18:06 +08:00
|
|
|
uint slots; /* Variable slots */
|
2022-03-06 23:37:30 +08:00
|
|
|
byte active; /* Currently entered */
|
|
|
|
byte soft_scopes; /* Number of soft scopes above */
|
2017-05-26 05:30:39 +08:00
|
|
|
};
|
|
|
|
|
2021-04-15 03:39:43 +08:00
|
|
|
struct bytestring {
|
|
|
|
size_t length;
|
|
|
|
byte data[];
|
|
|
|
};
|
|
|
|
|
2015-02-21 19:42:31 +08:00
|
|
|
#define SYM_MAX_LEN 64
|
|
|
|
|
2000-06-04 00:56:00 +08:00
|
|
|
/* Remember to update cf_symbol_class_name() */
|
1998-11-28 03:35:10 +08:00
|
|
|
#define SYM_VOID 0
|
1998-11-28 05:07:02 +08:00
|
|
|
#define SYM_PROTO 1
|
2013-07-26 04:33:57 +08:00
|
|
|
#define SYM_TEMPLATE 2
|
1999-11-15 19:34:51 +08:00
|
|
|
#define SYM_FUNCTION 3
|
|
|
|
#define SYM_FILTER 4
|
|
|
|
#define SYM_TABLE 5
|
2018-11-22 03:37:11 +08:00
|
|
|
#define SYM_ATTRIBUTE 6
|
1998-11-28 03:35:10 +08:00
|
|
|
|
1999-11-15 19:34:51 +08:00
|
|
|
#define SYM_VARIABLE 0x100 /* 0x100-0x1ff are variable types */
|
2018-11-22 03:37:11 +08:00
|
|
|
#define SYM_VARIABLE_RANGE SYM_VARIABLE ... (SYM_VARIABLE | 0xff)
|
2013-07-26 04:33:57 +08:00
|
|
|
#define SYM_CONSTANT 0x200 /* 0x200-0x2ff are variable types */
|
2018-11-22 03:37:11 +08:00
|
|
|
#define SYM_CONSTANT_RANGE SYM_CONSTANT ... (SYM_CONSTANT | 0xff)
|
2013-07-26 04:33:57 +08:00
|
|
|
|
2019-02-15 20:53:17 +08:00
|
|
|
#define SYM_TYPE(s) ((s)->val->type)
|
|
|
|
#define SYM_VAL(s) ((s)->val->val)
|
|
|
|
|
|
|
|
/* Symbol flags */
|
|
|
|
#define SYM_FLAG_SAME 0x1 /* For SYM_FUNCTION and SYM_FILTER */
|
1999-03-30 04:21:28 +08:00
|
|
|
|
2011-09-12 03:21:47 +08:00
|
|
|
struct include_file_stack {
|
2012-07-19 01:29:33 +08:00
|
|
|
void *buffer; /* Internal lexer state */
|
|
|
|
char *file_name; /* File name */
|
|
|
|
int fd; /* File descriptor */
|
|
|
|
int lino; /* Current line num */
|
2018-09-11 22:55:41 +08:00
|
|
|
int chno; /* Current char num (on current line) */
|
|
|
|
int toklen; /* Current token length */
|
2012-07-19 01:29:33 +08:00
|
|
|
int depth; /* Include depth, 0 = cannot include */
|
|
|
|
|
|
|
|
struct include_file_stack *prev; /* Previous record in stack */
|
|
|
|
struct include_file_stack *up; /* Parent (who included this file) */
|
2011-09-12 03:21:47 +08:00
|
|
|
};
|
|
|
|
|
2011-10-10 07:01:58 +08:00
|
|
|
extern struct include_file_stack *ifs;
|
2011-09-12 03:21:47 +08:00
|
|
|
|
2019-04-08 23:05:07 +08:00
|
|
|
extern struct sym_scope *conf_this_scope;
|
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
int cf_lex(void);
|
2011-09-12 03:21:47 +08:00
|
|
|
void cf_lex_init(int is_cli, struct config *c);
|
2014-03-25 21:58:00 +08:00
|
|
|
void cf_lex_unwind(void);
|
|
|
|
|
2019-02-26 23:44:24 +08:00
|
|
|
struct symbol *cf_find_symbol(const struct config *cfg, const byte *c);
|
2015-11-09 07:42:02 +08:00
|
|
|
|
2019-02-26 00:19:47 +08:00
|
|
|
struct symbol *cf_get_symbol(const byte *c);
|
2000-01-17 19:52:50 +08:00
|
|
|
struct symbol *cf_default_name(char *template, int *counter);
|
2019-02-15 20:53:17 +08:00
|
|
|
struct symbol *cf_localize_symbol(struct symbol *sym);
|
|
|
|
|
2022-03-06 23:37:30 +08:00
|
|
|
static inline int cf_symbol_is_local(struct symbol *sym)
|
|
|
|
{ return (sym->scope == conf_this_scope) && !conf_this_scope->soft_scopes; }
|
|
|
|
|
2019-02-15 20:53:17 +08:00
|
|
|
/**
|
|
|
|
* cf_define_symbol - define meaning of a symbol
|
|
|
|
* @sym: symbol to be defined
|
|
|
|
* @type: symbol class to assign
|
|
|
|
* @def: class dependent data
|
|
|
|
*
|
|
|
|
* Defines new meaning of a symbol. If the symbol is an undefined
|
|
|
|
* one (%SYM_VOID), it's just re-defined to the new type. If it's defined
|
|
|
|
* in different scope, a new symbol in current scope is created and the
|
|
|
|
* meaning is assigned to it. If it's already defined in the current scope,
|
|
|
|
* an error is reported via cf_error().
|
|
|
|
*
|
|
|
|
* Result: Pointer to the newly defined symbol. If we are in the top-level
|
|
|
|
* scope, it's the same @sym as passed to the function.
|
|
|
|
*/
|
2020-02-04 17:34:46 +08:00
|
|
|
#define cf_define_symbol(osym_, type_, var_, def_) ({ \
|
|
|
|
struct symbol *sym_ = cf_localize_symbol(osym_); \
|
|
|
|
sym_->class = type_; \
|
|
|
|
sym_->var_ = def_; \
|
|
|
|
sym_; })
|
2019-02-15 20:53:17 +08:00
|
|
|
|
1999-11-04 21:53:47 +08:00
|
|
|
void cf_push_scope(struct symbol *);
|
|
|
|
void cf_pop_scope(void);
|
2022-03-06 23:37:30 +08:00
|
|
|
void cf_push_soft_scope(void);
|
|
|
|
void cf_pop_soft_scope(void);
|
|
|
|
|
2000-01-19 20:30:19 +08:00
|
|
|
char *cf_symbol_class_name(struct symbol *sym);
|
1998-11-28 03:35:10 +08:00
|
|
|
|
|
|
|
/* Parser */
|
|
|
|
|
2016-11-09 23:36:34 +08:00
|
|
|
extern char *cf_text;
|
1998-11-28 03:35:10 +08:00
|
|
|
int cf_parse(void);
|
|
|
|
|
1999-12-06 21:44:45 +08:00
|
|
|
/* Sysdep hooks */
|
|
|
|
|
|
|
|
void sysdep_preconfig(struct config *);
|
2000-01-17 00:44:50 +08:00
|
|
|
int sysdep_commit(struct config *, struct config *);
|
2000-01-17 01:40:26 +08:00
|
|
|
void sysdep_shutdown_done(void);
|
1999-12-06 21:44:45 +08:00
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
#endif
|