From ed8b68ad06a8c9639a592903b79039ffea1e1b28 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 21 Dec 2012 16:23:26 +0000 Subject: [PATCH] Simplify and fix RA lifetime calculation. --- src/dhcp6.c | 15 ++------------- src/dnsmasq.h | 1 - src/radv.c | 35 +++++++++++++---------------------- 3 files changed, 15 insertions(+), 36 deletions(-) diff --git a/src/dhcp6.c b/src/dhcp6.c index b71cdac..2296ab9 100644 --- a/src/dhcp6.c +++ b/src/dhcp6.c @@ -488,6 +488,8 @@ static int construct_worker(struct in6_addr *local, int prefix, (void)scope; (void)flags; + (void)valid; + (void)preferred; struct cparam *param = vparam; @@ -549,19 +551,6 @@ static int construct_worker(struct in6_addr *local, int prefix, log_context(AF_INET6, context); } - - if (context) - { - if (valid == -1) - context->valid = valid; - else - context->valid = valid + param->now; - - if (preferred == -1) - context->preferred = preferred; - else - context->preferred = preferred + param->now; - } } return 1; diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 5e4d3ab..02ac627 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -685,7 +685,6 @@ struct dhcp_context { int prefix, if_index; time_t ra_time, ra_short_period_start; char *template_interface; - int valid, preferred; /* times from address for constructed contexts */ #endif int flags; struct dhcp_netid netid, *filter; diff --git a/src/radv.c b/src/radv.c index debccb2..c97661c 100644 --- a/src/radv.c +++ b/src/radv.c @@ -331,10 +331,7 @@ static int add_prefixes(struct in6_addr *local, int prefix, struct ra_param *param = vparam; (void)scope; /* warning */ - (void)flags; - (void)preferred; - (void)valid; - + if (if_index == param->ind) { if (IN6_IS_ADDR_LINKLOCAL(local)) @@ -345,9 +342,7 @@ static int add_prefixes(struct in6_addr *local, int prefix, int do_prefix = 0; int do_slaac = 0; int deprecate = 0; - int found_constructed = 0; unsigned int time = 0xffffffff; - int calc_valid = 0, calc_preferred = 0; struct dhcp_context *context; for (context = daemon->dhcp6; context; context = context->next) @@ -376,17 +371,6 @@ static int add_prefixes(struct in6_addr *local, int prefix, param->other = 1; } - if (context->flags & CONTEXT_CONSTRUCTED) - { - found_constructed = 1; - calc_valid = context->valid; - calc_preferred = context->preferred; - if (context->valid != -1) - calc_valid -= (int)param->now; - if (context->preferred != -1) - calc_preferred -= (int)param->now; - } - /* find floor time */ if (time > context->lease_time) time = context->lease_time; @@ -417,10 +401,17 @@ static int add_prefixes(struct in6_addr *local, int prefix, param->found_context = 1; } - if (!found_constructed) + /* configured time is ceiling */ + if ((unsigned int)valid > time) + valid = time; + + if ((flags & IFACE_DEPRECATED) || deprecate) + preferred = 0; + else { - calc_valid = time; - calc_preferred = deprecate ? 0 : time; + /* configured time is ceiling */ + if ((unsigned int)preferred > time) + preferred = time; } if (do_prefix) @@ -441,8 +432,8 @@ static int add_prefixes(struct in6_addr *local, int prefix, opt->prefix_len = prefix; /* autonomous only if we're not doing dhcp, always set "on-link" */ opt->flags = do_slaac ? 0xC0 : 0x80; - opt->valid_lifetime = htonl(calc_valid); - opt->preferred_lifetime = htonl(calc_preferred); + opt->valid_lifetime = htonl(valid); + opt->preferred_lifetime = htonl(preferred); opt->reserved = 0; opt->prefix = *local;