]> 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 b5f4b5f24b08be55f98f10da5cc2dc5fbd9b9a41..53715f776c31df1ec3f62e7d6a25c3363c081551 100644 (file)
@@ -27,16 +27,19 @@ 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, PREFERENCE, LOW, MEDIUM, HIGH)
+       LOCAL, TRIGGER, SENSITIVE, PREFERENCE, LOW, MEDIUM, HIGH, PROPAGATE,
+       ROUTE, ROUTES, RA_PREFERENCE, RA_LIFETIME)
+
+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
 {
@@ -56,6 +59,7 @@ radv_proto_item:
  | 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 net_ip6 { RADV_CFG->trigger = $2; }
+ | PROPAGATE ROUTES bool { RADV_CFG->propagate_routes = $3; }
  ;
 
 radv_proto_opts:
@@ -76,13 +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:
@@ -100,7 +109,14 @@ radv_iface_item:
      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); }
@@ -123,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");
 
   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);
 };
 
 
@@ -292,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