summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2012-12-21 16:23:26 +0000
committerSimon Kelley <simon@thekelleys.org.uk>2012-12-21 16:23:26 +0000
commited8b68ad06a8c9639a592903b79039ffea1e1b28 (patch)
treeb27df749752e31b9bfe9c29a5676f677fe3c00e4
parentbad7b875eb4e3a8f69b08eab84602257eb51455c (diff)
downloaddnsmasq-ed8b68ad06a8c9639a592903b79039ffea1e1b28.tar.gz
Simplify and fix RA lifetime calculation.
-rw-r--r--src/dhcp6.c15
-rw-r--r--src/dnsmasq.h1
-rw-r--r--src/radv.c35
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;