]> git.ipfire.org Git - thirdparty/bird.git/blobdiff - proto/radv/config.Y
Merge branch 'mq-filter-stack' of gitlab.labs.nic.cz:labs/bird into mq-filter-stack
[thirdparty/bird.git] / proto / radv / config.Y
index ff70a2f7ffc3272c76376aa080e032fb9fc6a971..53715f776c31df1ec3f62e7d6a25c3363c081551 100644 (file)
@@ -27,20 +27,24 @@ static u8 radv_mult_val;    /* Used by radv_mult for second return value */
 CF_DECLS
 
 CF_KEYWORDS(RADV, PREFIX, INTERFACE, MIN, MAX, RA, DELAY, INTERVAL,
-       MANAGED, OTHER, CONFIG, LINK, MTU, REACHABLE, TIME, RETRANS,
+       MANAGED, OTHER, CONFIG, LINGER, LINK, MTU, REACHABLE, TIME, RETRANS,
        TIMER, CURRENT, HOP, LIMIT, DEFAULT, VALID, PREFERRED, MULT,
        LIFETIME, SKIP, ONLINK, AUTONOMOUS, RDNSS, DNSSL, NS, DOMAIN,
-       LOCAL, TRIGGER, SENSITIVE)
+       LOCAL, TRIGGER, SENSITIVE, PREFERENCE, LOW, MEDIUM, HIGH, PROPAGATE,
+       ROUTE, ROUTES, RA_PREFERENCE, RA_LIFETIME)
 
-%type<i> radv_mult radv_sensitive
+CF_ENUM(T_ENUM_RA_PREFERENCE, RA_PREF_, LOW, MEDIUM, HIGH)
+
+%type<i> radv_mult radv_sensitive radv_preference
 
 CF_GRAMMAR
 
-CF_ADDTO(proto, radv_proto)
+proto: radv_proto ;
 
 radv_proto_start: proto_start RADV
 {
-  this_proto = proto_config_new(&proto_radv, sizeof(struct radv_config), $1);
+  this_proto = proto_config_new(&proto_radv, $1);
+
   init_list(&RADV_CFG->patt_list);
   init_list(&RADV_CFG->pref_list);
   init_list(&RADV_CFG->rdnss_list);
@@ -49,15 +53,13 @@ radv_proto_start: proto_start RADV
 
 radv_proto_item:
    proto_item
+ | proto_channel
  | INTERFACE radv_iface
  | PREFIX radv_prefix { add_tail(&RADV_CFG->pref_list, NODE this_radv_prefix); }
  | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_CFG->rdnss_list, &radv_dns_list); }
  | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_CFG->dnssl_list, &radv_dns_list); }
- | TRIGGER prefix {
-     RADV_CFG->trigger_prefix = $2.addr;
-     RADV_CFG->trigger_pxlen = $2.len;
-     RADV_CFG->trigger_valid = 1;
-   }
+ | TRIGGER net_ip6 { RADV_CFG->trigger = $2; }
+ | PROPAGATE ROUTES bool { RADV_CFG->propagate_routes = $3; }
  ;
 
 radv_proto_opts:
@@ -78,12 +80,18 @@ radv_iface_start:
   init_list(&RADV_IFACE->rdnss_list);
   init_list(&RADV_IFACE->dnssl_list);
 
-  RADV_IFACE->min_ra_int = -1; /* undefined */
+  RADV_IFACE->min_ra_int = (u32) -1; /* undefined */
   RADV_IFACE->max_ra_int = DEFAULT_MAX_RA_INT;
   RADV_IFACE->min_delay = DEFAULT_MIN_DELAY;
+  RADV_IFACE->prefix_linger_time = (u32) -1;
+  RADV_IFACE->route_linger_time = (u32) -1;
   RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT;
-  RADV_IFACE->default_lifetime = -1;
+  RADV_IFACE->default_lifetime = (u32) -1;
   RADV_IFACE->default_lifetime_sensitive = 1;
+  RADV_IFACE->default_preference = RA_PREF_MEDIUM;
+  RADV_IFACE->route_lifetime = (u32) -1;
+  RADV_IFACE->route_lifetime_sensitive = 0;
+  RADV_IFACE->route_preference = RA_PREF_MEDIUM;
 };
 
 radv_iface_item:
@@ -92,15 +100,23 @@ radv_iface_item:
  | MIN DELAY expr { RADV_IFACE->min_delay = $3; if ($3 <= 0) cf_error("Min delay must be positive"); }
  | MANAGED bool { RADV_IFACE->managed = $2; }
  | OTHER CONFIG bool { RADV_IFACE->other_config = $3; }
- | LINK MTU expr { RADV_IFACE->link_mtu = $3; if ($3 < 0) cf_error("Link MTU must be 0 or positive"); }
- | REACHABLE TIME expr { RADV_IFACE->reachable_time = $3; if (($3 < 0) || ($3 > 3600000)) cf_error("Reachable time must be in range 0-3600000"); }
- | RETRANS TIMER expr { RADV_IFACE->retrans_timer = $3; if ($3 < 0) cf_error("Retrans timer must be 0 or positive"); }
- | CURRENT HOP LIMIT expr { RADV_IFACE->current_hop_limit = $4; if (($4 < 0) || ($4 > 255))  cf_error("Current hop limit must be in range 0-255"); }
+ | LINK MTU expr { RADV_IFACE->link_mtu = $3; }
+ | REACHABLE TIME expr { RADV_IFACE->reachable_time = $3; if ($3 > 3600000) cf_error("Reachable time must be in range 0-3600000"); }
+ | RETRANS TIMER expr { RADV_IFACE->retrans_timer = $3; }
+ | CURRENT HOP LIMIT expr { RADV_IFACE->current_hop_limit = $4; if ($4 > 255) cf_error("Current hop limit must be in range 0-255"); }
  | DEFAULT LIFETIME expr radv_sensitive {
      RADV_IFACE->default_lifetime = $3;
-     if (($3 < 0) || ($3 > 9000))  cf_error("Default lifetime must be in range 0-9000");
-     if ($4 != -1) RADV_IFACE->default_lifetime_sensitive = $4;
+     if ($3 > 9000)  cf_error("Default lifetime must be in range 0-9000");
+     if ($4 != (uint) -1) RADV_IFACE->default_lifetime_sensitive = $4;
+   }
+ | ROUTE LIFETIME expr radv_sensitive {
+     RADV_IFACE->route_lifetime = $3;
+     if ($4 != (uint) -1) RADV_IFACE->route_lifetime_sensitive = $4;
    }
+ | DEFAULT PREFERENCE radv_preference { RADV_IFACE->default_preference = $3; }
+ | ROUTE PREFERENCE radv_preference { RADV_IFACE->route_preference = $3; }
+ | PREFIX LINGER TIME expr { RADV_IFACE->prefix_linger_time = $4; }
+ | ROUTE LINGER TIME expr { RADV_IFACE->route_linger_time = $4; }
  | PREFIX radv_prefix { add_tail(&RADV_IFACE->pref_list, NODE this_radv_prefix); }
  | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_IFACE->rdnss_list, &radv_dns_list); }
  | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_IFACE->dnssl_list, &radv_dns_list); }
@@ -108,6 +124,11 @@ radv_iface_item:
  | DNSSL LOCAL bool { RADV_IFACE->dnssl_local = $3; }
  ;
 
+radv_preference:
+   LOW { $$ = RA_PREF_LOW; }
+ | MEDIUM { $$ = RA_PREF_MEDIUM; }
+ | HIGH { $$ = RA_PREF_HIGH; }
+
 radv_iface_finish:
 {
   struct radv_iface_config *ic = RADV_IFACE;
@@ -118,12 +139,32 @@ radv_iface_finish:
   if (ic->default_lifetime == (u32) -1)
     ic->default_lifetime = 3 * ic->max_ra_int;
 
+  if (ic->route_lifetime == (u32) -1)
+    ic->route_lifetime = 3 * ic->max_ra_int;
+
+  if (ic->prefix_linger_time == (u32) -1)
+    ic->prefix_linger_time = 3 * ic->max_ra_int;
+
+  if (ic->route_linger_time == (u32) -1)
+    ic->route_linger_time = 3 * ic->max_ra_int;
+
   if ((ic->min_ra_int > 3) &&
       (ic->min_ra_int > (ic->max_ra_int * 3 / 4)))
-    cf_error("Min RA interval must be at most 3/4 * Max RA interval %d %d", ic->min_ra_int, ic->max_ra_int);
+    cf_error("Min RA interval must be at most 3/4 * Max RA interval");
 
   if ((ic->default_lifetime > 0) && (ic->default_lifetime < ic->max_ra_int))
     cf_error("Default lifetime must be either 0 or at least Max RA interval");
+
+  if ((ic->route_lifetime > 0) && (ic->route_lifetime < ic->max_ra_int))
+    cf_error("Route lifetime must be either 0 or at least Max RA interval");
+
+  if ((ic->prefix_linger_time > 0) && (ic->prefix_linger_time < ic->max_ra_int))
+    cf_error("Prefix linger time must be either 0 or at least Max RA interval");
+
+  if ((ic->route_linger_time > 0) && (ic->route_linger_time < ic->max_ra_int))
+    cf_error("Route linger time must be either 0 or at least Max RA interval");
+
+  RADV_CFG->max_linger_time = MAX_(RADV_CFG->max_linger_time, ic->route_linger_time);
 };
 
 
@@ -138,14 +179,13 @@ radv_iface_opt_list:
  ;
 
 radv_iface:
-  radv_iface_start iface_patt_list radv_iface_opt_list radv_iface_finish;
+  radv_iface_start iface_patt_list_nopx radv_iface_opt_list radv_iface_finish;
 
 
-radv_prefix_start: prefix
+radv_prefix_start: net_ip6
 {
   this_radv_prefix = cfg_allocz(sizeof(struct radv_prefix_config));
-  RADV_PREFIX->prefix = $1.addr;
-  RADV_PREFIX->pxlen = $1.len;
+  RADV_PREFIX->prefix = *(net_addr_ip6 *) &($1);
 
   RADV_PREFIX->onlink = 1;
   RADV_PREFIX->autonomous = 1;
@@ -159,13 +199,11 @@ radv_prefix_item:
  | AUTONOMOUS bool { RADV_PREFIX->autonomous = $2; }
  | VALID LIFETIME expr radv_sensitive {
      RADV_PREFIX->valid_lifetime = $3;
-     if ($3 < 0) cf_error("Valid lifetime must be 0 or positive");
-     if ($4 != -1) RADV_PREFIX->valid_lifetime_sensitive = $4;
+     if ($4 != (uint) -1) RADV_PREFIX->valid_lifetime_sensitive = $4;
    }
  | PREFERRED LIFETIME expr radv_sensitive {
      RADV_PREFIX->preferred_lifetime = $3;
-     if ($3 < 0) cf_error("Preferred lifetime must be 0 or positive");
-     if ($4 != -1) RADV_PREFIX->preferred_lifetime_sensitive = $4;
+     if ($4 != (uint) -1) RADV_PREFIX->preferred_lifetime_sensitive = $4;
    }
  ;
 
@@ -290,10 +328,13 @@ radv_mult:
  ;
 
 radv_sensitive:
-   /* empty */ { $$ = -1; }
+   /* empty */ { $$ = (uint) -1; }
  | SENSITIVE bool { $$ = $2; }
  ;
 
+dynamic_attr: RA_PREFERENCE { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_ENUM_RA_PREFERENCE, EA_RA_PREFERENCE); } ;
+dynamic_attr: RA_LIFETIME { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_RA_LIFETIME); } ;
+
 CF_CODE
 
 CF_END