diff options
Diffstat (limited to 'proto')
-rw-r--r-- | proto/radv/config.Y | 4 | ||||
-rw-r--r-- | proto/radv/radv.c | 4 | ||||
-rw-r--r-- | proto/radv/radv.h | 6 |
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 |