summaryrefslogtreecommitdiff
path: root/proto/radv
diff options
context:
space:
mode:
authorMichal 'vorner' Vaner <michal.vaner@nic.cz>2017-08-17 11:34:25 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2017-08-30 16:34:15 +0200
commitec7d6a506ecae89e5019ce7fcb380a713be28bce (patch)
tree9e038f0fb760223b2710aec35fa5348fa0ad60d2 /proto/radv
parente2d2b3ef21f082a034e79d0880d4b36428029a59 (diff)
RAdv: Configure how long a dead prefix is advertised
Diffstat (limited to 'proto/radv')
-rw-r--r--proto/radv/config.Y4
-rw-r--r--proto/radv/radv.c4
-rw-r--r--proto/radv/radv.h6
3 files changed, 10 insertions, 4 deletions
diff --git a/proto/radv/config.Y b/proto/radv/config.Y
index da300667..0ff84aeb 100644
--- a/proto/radv/config.Y
+++ b/proto/radv/config.Y
@@ -27,7 +27,7 @@ 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)
@@ -82,6 +82,7 @@ radv_iface_start:
RADV_IFACE->max_ra_int = DEFAULT_MAX_RA_INT;
RADV_IFACE->min_delay = DEFAULT_MIN_DELAY;
RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT;
+ RADV_IFACE->linger_time = DEFAULT_LINGER_TIME;
RADV_IFACE->default_lifetime = -1;
RADV_IFACE->default_lifetime_sensitive = 1;
RADV_IFACE->default_preference = RA_PREF_MEDIUM;
@@ -96,6 +97,7 @@ radv_iface_item:
| 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"); }
+ | LINGER TIME expr { RADV_IFACE->linger_time = $3; if (($3 < 0) || ($3 > 3600)) cf_error("Linger time must be in range 0-3600"); }
| 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"); }
| DEFAULT LIFETIME expr radv_sensitive {
RADV_IFACE->default_lifetime = $3;
diff --git a/proto/radv/radv.c b/proto/radv/radv.c
index 303cf251..44040a4b 100644
--- a/proto/radv/radv.c
+++ b/proto/radv/radv.c
@@ -115,6 +115,7 @@ static void
prefixes_prepare(struct radv_iface *ifa)
{
struct radv_proto *p = ifa->ra;
+ struct radv_iface_config *cf = ifa->cf;
/* First mark all the prefixes as unused */
struct radv_prefix *pfx;
@@ -164,8 +165,7 @@ prefixes_prepare(struct radv_iface *ifa)
* dropped just yet). If something is dead and rots there for long enough,
* clean it up.
*/
- // XXX: Make these 5 minutes it configurable
- bird_clock_t rotten = now + 300;
+ bird_clock_t rotten = now + cf->linger_time;
struct radv_prefix *next;
bird_clock_t expires_soonest = 0;
WALK_LIST_DELSAFE(pfx, next, ifa->prefixes) {
diff --git a/proto/radv/radv.h b/proto/radv/radv.h
index 54d7c6f0..777c6e16 100644
--- a/proto/radv/radv.h
+++ b/proto/radv/radv.h
@@ -35,6 +35,7 @@
#define DEFAULT_MAX_RA_INT 600
#define DEFAULT_MIN_DELAY 3
#define DEFAULT_CURRENT_HOP_LIMIT 64
+#define DEFAULT_LINGER_TIME 300
#define DEFAULT_VALID_LIFETIME 86400
#define DEFAULT_PREFERRED_LIFETIME 14400
@@ -66,6 +67,9 @@ struct radv_iface_config
u32 max_ra_int;
u32 min_delay;
+ u32 linger_time; /* How long a dead prefix should still be advertised with 0
+ lifetime */
+
u8 rdnss_local; /* Global list is not used for RDNSS */
u8 dnssl_local; /* Global list is not used for DNSSL */
@@ -77,7 +81,7 @@ struct radv_iface_config
u32 current_hop_limit;
u32 default_lifetime;
u8 default_lifetime_sensitive; /* Whether default_lifetime depends on trigger */
- u8 default_preference; /* Default Router Preference (RFC 4191) */
+ u8 default_preference; /* Default Router Preference (RFC 4191) */
};
struct radv_prefix_config