Handle standard and contructed dhcp-ranges on the same interface.
diff --git a/CHANGELOG b/CHANGELOG
index 2908275..d6aa7ff 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -23,6 +23,12 @@
which packets should be dumped is given by the --dumpmask
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
Fix parsing of CNAME arguments, which are confused by extra spaces.
diff --git a/src/dhcp6.c b/src/dhcp6.c
index 3af747d..0b2f91f 100644
--- a/src/dhcp6.c
+++ b/src/dhcp6.c
@@ -667,23 +667,28 @@
end6 = *local;
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)
- if ((context->flags & CONTEXT_CONSTRUCTED) &&
+ if (!(context->flags & CONTEXT_TEMPLATE) &&
IN6_ARE_ADDR_EQUAL(&start6, &context->start6) &&
IN6_ARE_ADDR_EQUAL(&end6, &context->end6))
{
- int flags = context->flags;
- context->flags &= ~(CONTEXT_GC | CONTEXT_OLD);
- if (flags & CONTEXT_OLD)
+ if (context->flags & CONTEXT_CONSTRUCTED)
{
- /* address went, now it's back */
- log_context(AF_INET6, context);
- /* fast RAs for a while */
- ra_start_unsolicited(param->now, context);
- param->newone = 1;
- /* Add address to name again */
- if (context->flags & CONTEXT_RA_NAME)
- param->newname = 1;
+ int cflags = context->flags;
+ context->flags &= ~(CONTEXT_GC | CONTEXT_OLD);
+ if (cflags & CONTEXT_OLD)
+ {
+ /* address went, now it's back */
+ log_context(AF_INET6, context);
+ /* fast RAs for a while */
+ ra_start_unsolicited(param->now, context);
+ param->newone = 1;
+ /* Add address to name again */
+ if (context->flags & CONTEXT_RA_NAME)
+ param->newname = 1;
+ }
}
break;
}