bird/conf/confbase.Y

218 lines
3.8 KiB
Text
Raw Normal View History

1998-11-28 03:36:06 +08:00
/*
* BIRD -- Configuration Parser Top
*
* (c) 1998--2000 Martin Mares <mj@ucw.cz>
1998-11-28 03:36:06 +08:00
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
CF_HDR
#define PARSER 1
1998-11-28 03:36:06 +08:00
#include "nest/bird.h"
#include "conf/conf.h"
#include "lib/resource.h"
#include "lib/socket.h"
#include "lib/timer.h"
#include "lib/string.h"
#include "nest/protocol.h"
#include "nest/iface.h"
#include "nest/route.h"
#include "nest/cli.h"
#include "filter/filter.h"
1998-11-28 03:36:06 +08:00
/* FIXME: Turn on YYERROR_VERBOSE and work around lots of bison bugs? */
CF_DEFINES
static void
check_u16(unsigned val)
{
if (val > 0xFFFF)
cf_error("Value %d out of range (0-65535)", val);
}
1998-11-28 03:36:06 +08:00
CF_DECLS
%union {
int i;
u32 i32;
1998-11-28 03:36:06 +08:00
ip_addr a;
struct symbol *s;
char *t;
struct rtable_config *r;
struct f_inst *x;
struct f_dynamic_attr fda;
struct f_static_attr fsa;
struct filter *f;
struct f_tree *e;
struct f_trie *trie;
struct f_val v;
struct f_path_mask *h;
1999-05-26 22:24:32 +08:00
struct password_item *p;
struct rt_show_data *ra;
struct roa_show_data *ro;
struct sym_show_data *sd;
struct lsadb_show_data *ld;
struct iface *iface;
struct roa_table *rot;
void *g;
bird_clock_t time;
struct prefix px;
struct proto_spec ps;
2010-02-03 07:19:24 +08:00
struct timeformat *tf;
1998-11-28 03:36:06 +08:00
}
%token END CLI_MARKER INVALID_TOKEN ELSECOL DDOT
2000-06-01 16:43:29 +08:00
%token GEQ LEQ NEQ AND OR
2009-03-14 19:43:10 +08:00
%token PO PC
1999-11-15 19:35:41 +08:00
%token <i> NUM ENUM
%token <i32> RTRID
1998-11-28 03:36:06 +08:00
%token <a> IPA
%token <s> SYM
%token <t> TEXT
%type <iface> ipa_scope
1998-11-28 03:36:06 +08:00
%type <i> expr bool pxlen
%type <i32> expr_us
%type <time> datetime
%type <a> ipa
2000-05-13 19:41:26 +08:00
%type <px> prefix prefix_or_ipa
%type <t> text opttext
%type <t> text_or_none
2000-05-16 22:24:33 +08:00
%nonassoc PREFIX_DUMMY
2010-01-28 06:45:36 +08:00
%left AND OR
2016-09-20 21:13:01 +08:00
%nonassoc '=' '<' '>' '~' GEQ LEQ NEQ NMA PO PC
2010-01-28 06:45:36 +08:00
%left '+' '-'
%left '*' '/' '%'
%left '!'
%nonassoc '.'
CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT)
1998-11-28 03:36:06 +08:00
CF_GRAMMAR
/* Basic config file structure */
config: conf_entries END { return 0; }
1999-11-17 20:00:21 +08:00
| CLI_MARKER cli_cmd { return 0; }
1998-11-28 03:36:06 +08:00
;
conf_entries:
/* EMPTY */
| conf_entries conf
1998-11-28 03:36:06 +08:00
;
CF_ADDTO(conf, ';')
1998-11-28 03:36:06 +08:00
/* Constant expressions */
CF_ADDTO(conf, definition)
definition:
DEFINE SYM '=' term ';' {
struct f_val *val = cfg_alloc(sizeof(struct f_val));
*val = f_eval($4, cfg_mem);
if (val->type == T_RETURN) cf_error("Runtime error");
cf_define_symbol($2, SYM_CONSTANT | val->type, val);
}
;
expr:
NUM
| '(' term ')' { $$ = f_eval_int($2); }
| SYM {
if ($1->class != (SYM_CONSTANT | T_INT)) cf_error("Number expected");
$$ = SYM_VAL($1).i; }
;
expr_us:
expr S { $$ = (u32) $1 * 1000000; }
| expr MS { $$ = (u32) $1 * 1000; }
| expr US { $$ = (u32) $1 * 1; }
;
/* expr_u16: expr { check_u16($1); $$ = $1; }; */
/* Switches */
bool:
2016-11-09 00:46:29 +08:00
expr { $$ = !!$1; }
| ON { $$ = 1; }
| YES { $$ = 1; }
| OFF { $$ = 0; }
| NO { $$ = 0; }
| /* Silence means agreement */ { $$ = 1; }
;
/* Addresses, prefixes and netmasks */
ipa:
IPA
| SYM {
if ($1->class != (SYM_CONSTANT | T_IP)) cf_error("IP address expected");
$$ = SYM_VAL($1).px.ip;
}
;
ipa_scope:
/* empty */ { $$ = NULL; }
| '%' SYM { $$ = if_get_by_name($2->name); }
;
prefix:
ipa pxlen {
if (!ip_is_prefix($1, $2)) cf_error("Invalid prefix");
$$.addr = $1; $$.len = $2;
}
;
2000-05-13 19:41:26 +08:00
prefix_or_ipa:
prefix
| ipa { $$.addr = $1; $$.len = BITS_PER_IP_ADDRESS; }
2000-05-13 19:41:26 +08:00
;
pxlen:
'/' expr {
2000-05-05 04:02:19 +08:00
if ($2 < 0 || $2 > BITS_PER_IP_ADDRESS) cf_error("Invalid prefix length %d", $2);
$$ = $2;
}
| ':' ipa {
2014-10-24 17:11:43 +08:00
$$ = ipa_masklen($2);
if ($$ < 0) cf_error("Invalid netmask %I", $2);
}
;
2000-03-05 05:27:57 +08:00
datetime:
TEXT {
2005-02-13 06:27:55 +08:00
$$ = tm_parse_datetime($1);
if (!$$)
2005-02-13 06:27:55 +08:00
cf_error("Invalid date and time");
}
1999-05-26 22:24:32 +08:00
;
text:
TEXT
| SYM {
if ($1->class != (SYM_CONSTANT | T_STRING)) cf_error("String expected");
$$ = SYM_VAL($1).s;
}
;
opttext:
TEXT
| /* empty */ { $$ = NULL; }
;
text_or_none:
TEXT { $$ = $1; }
| { $$ = NULL; }
;
1998-11-28 03:36:06 +08:00
CF_CODE
CF_END