diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2012-12-21 16:23:26 +0000 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2012-12-21 16:23:26 +0000 |
commit | ed8b68ad06a8c9639a592903b79039ffea1e1b28 (patch) | |
tree | b27df749752e31b9bfe9c29a5676f677fe3c00e4 | |
parent | bad7b875eb4e3a8f69b08eab84602257eb51455c (diff) | |
download | dnsmasq-ed8b68ad06a8c9639a592903b79039ffea1e1b28.tar.gz |
Simplify and fix RA lifetime calculation.
-rw-r--r-- | src/dhcp6.c | 15 | ||||
-rw-r--r-- | src/dnsmasq.h | 1 | ||||
-rw-r--r-- | 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; @@ -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; |