]> git.ipfire.org Git - thirdparty/bird.git/blobdiff - conf/confbase.Y
Symbol names enclosed by apostrophes can contain DOTs.
[thirdparty/bird.git] / conf / confbase.Y
index 0b9f3d309c3be4d546a6bbc63d09a820ac937f0f..dcb0719f87599dde2827f38f340b19bdf03c9225 100644 (file)
@@ -8,11 +8,14 @@
 
 CF_HDR
 
+#define PARSER 1
+
 #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"
@@ -21,6 +24,15 @@ CF_HDR
 
 /* 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);
+}
+
 CF_DECLS
 
 %union {
@@ -33,28 +45,46 @@ CF_DECLS
   struct f_inst *x;
   struct filter *f;
   struct f_tree *e;
+  struct f_trie *trie;
   struct f_val v;
+  struct f_path_mask *h;
   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;
+  struct timeformat *tf;
 }
 
-%token END CLI_MARKER INVALID_TOKEN
-%token GEQ LEQ NEQ
+%token END CLI_MARKER INVALID_TOKEN ELSECOL DDOT
+%token GEQ LEQ NEQ AND OR
+%token PO PC
 %token <i> NUM ENUM
 %token <i32> RTRID
 %token <a> IPA
 %token <s> SYM
 %token <t> TEXT
+%type <iface> ipa_scope
 
 %type <i> expr bool pxlen
 %type <time> datetime
+%type <a> ipa
+%type <px> prefix prefix_or_ipa
+%type <t> text_or_none
 
-%nonassoc '=' '<' '>' '~' '.' GEQ LEQ NEQ
+%nonassoc PREFIX_DUMMY
+%left AND OR
+%nonassoc '=' '<' '>' '~' GEQ LEQ NEQ PO PC
 %left '+' '-'
 %left '*' '/' '%'
 %left '!'
+%nonassoc '.'
 
 CF_KEYWORDS(DEFINE, ON, OFF, YES, NO)
 
@@ -77,21 +107,22 @@ CF_ADDTO(conf, ';')
 
 expr:
    NUM
- | expr '+' expr { $$ = $1 + $3; }
- | expr '-' expr { $$ = $1 - $3; }
- | expr '*' expr { $$ = $1 * $3; }
- | expr '/' expr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
- | expr '%' expr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
- | '(' expr ')' { $$ = $2; }
+ | '(' term ')' { $$ = f_eval_int($2); }
  | SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; }
  ;
 
+/* expr_u16: expr { check_u16($1); $$ = $1; }; */
+
 CF_ADDTO(conf, definition)
 definition:
    DEFINE SYM '=' expr ';' {
      cf_define_symbol($2, SYM_NUMBER, NULL);
      $2->aux = $4;
    }
+ | DEFINE SYM '=' IPA ';' {
+     cf_define_symbol($2, SYM_IPA, cfg_alloc(sizeof(ip_addr)));
+     *(ip_addr *)$2->def = $4;
+   }
  ;
 
 /* Switches */
@@ -105,14 +136,39 @@ bool:
  | /* Silence means agreement */ { $$ = 1; }
  ;
 
-/* Prefixes and netmasks */
+/* Addresses, prefixes and netmasks */
+
+ipa:
+   IPA
+ | SYM {
+     if ($1->class != SYM_IPA) cf_error("IP address expected");
+     $$ = *(ip_addr *)$1->def;
+   }
+ ;
+
+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;
+   }
+ ;
+
+prefix_or_ipa:
+   prefix
+ | ipa { $$.addr = $1; $$.len = BITS_PER_IP_ADDRESS; }
+ ;
 
 pxlen:
-   '/' NUM {
-     if ($2 < 0 || $2 > 32) cf_error("Invalid prefix length %d", $2);
+   '/' expr {
+     if ($2 < 0 || $2 > BITS_PER_IP_ADDRESS) cf_error("Invalid prefix length %d", $2);
      $$ = $2;
    }
- | ':' IPA {
+ | ':' ipa {
      $$ = ipa_mklen($2);
      if ($$ < 0) cf_error("Invalid netmask %I", $2);
    }
@@ -120,12 +176,17 @@ pxlen:
 
 datetime:
    TEXT {
-     $$ = tm_parse_date($1);
+     $$ = tm_parse_datetime($1);
      if (!$$)
-       cf_error("Invalid date");
+       cf_error("Invalid date and time");
    }
  ;
 
+text_or_none:
+   TEXT { $$ = $1; }
+ |      { $$ = NULL; }
+ ;
+
 CF_CODE
 
 CF_END