Handle standard and contructed dhcp-ranges on the same interface.

This commit is contained in:
Simon Kelley
2018-06-02 13:06:00 +01:00
parent 1f1873aadd
commit c488b68e75
2 changed files with 23 additions and 12 deletions

View File

@@ -23,6 +23,12 @@ version 2.80
which packets should be dumped is given by the --dumpmask which packets should be dumped is given by the --dumpmask
option. option.
Handle the case of both standard and constructed dhcp-ranges on the
same interface better. We don't now contruct a dhcp-range if there's
already one specified. This allows the specified interface to
have different parameters and avoids advertising the same
prefix twice. Thanks to Luis Marsano for spotting this case.
version 2.79 version 2.79
Fix parsing of CNAME arguments, which are confused by extra spaces. Fix parsing of CNAME arguments, which are confused by extra spaces.

View File

@@ -667,14 +667,18 @@ static int construct_worker(struct in6_addr *local, int prefix,
end6 = *local; end6 = *local;
setaddr6part(&end6, addr6part(&template->end6)); setaddr6part(&end6, addr6part(&template->end6));
/* If there's an absolute address context covering this address
then don't contruct one as well. */
for (context = daemon->dhcp6; context; context = context->next) for (context = daemon->dhcp6; context; context = context->next)
if ((context->flags & CONTEXT_CONSTRUCTED) && if (!(context->flags & CONTEXT_TEMPLATE) &&
IN6_ARE_ADDR_EQUAL(&start6, &context->start6) && IN6_ARE_ADDR_EQUAL(&start6, &context->start6) &&
IN6_ARE_ADDR_EQUAL(&end6, &context->end6)) IN6_ARE_ADDR_EQUAL(&end6, &context->end6))
{ {
int flags = context->flags; if (context->flags & CONTEXT_CONSTRUCTED)
{
int cflags = context->flags;
context->flags &= ~(CONTEXT_GC | CONTEXT_OLD); context->flags &= ~(CONTEXT_GC | CONTEXT_OLD);
if (flags & CONTEXT_OLD) if (cflags & CONTEXT_OLD)
{ {
/* address went, now it's back */ /* address went, now it's back */
log_context(AF_INET6, context); log_context(AF_INET6, context);
@@ -685,6 +689,7 @@ static int construct_worker(struct in6_addr *local, int prefix,
if (context->flags & CONTEXT_RA_NAME) if (context->flags & CONTEXT_RA_NAME)
param->newname = 1; param->newname = 1;
} }
}
break; break;
} }