dhcp-host selection fix for v4/v6

This commit is contained in:
Simon Kelley
2013-10-11 15:19:28 +01:00
parent d56a604a96
commit 24b5a5d50b
3 changed files with 30 additions and 26 deletions

View File

@@ -144,6 +144,11 @@ version 2.67
target of --cname. Thanks to Hadmut Danisch for the target of --cname. Thanks to Hadmut Danisch for the
suggestion. suggestion.
Avoid treating a --dhcp-host which has an IPv6 address
as eligable for use with DHCPv4 on the grounds that it has
no address, and vice-versa. Thanks to Yury Konovalov for
spotting the problem.
version 2.66 version 2.66
Add the ability to act as an authoritative DNS Add the ability to act as an authoritative DNS

View File

@@ -272,27 +272,26 @@ static int is_config_in_context(struct dhcp_context *context, struct dhcp_config
if (!context) /* called via find_config() from lease_update_from_configs() */ if (!context) /* called via find_config() from lease_update_from_configs() */
return 1; return 1;
if (!(context->flags & CONTEXT_V6)) if (!(config->flags & (CONFIG_ADDR | CONFIG_ADDR6)))
{ return 1;
if (!(config->flags & CONFIG_ADDR))
#ifdef HAVE_DHCP6
if ((context->flags & CONTEXT_V6) && (config->flags & CONFIG_WILDCARD))
return 1;
#endif
for (; context; context = context->current)
#ifdef HAVE_DHCP6
if (context->flags & CONTEXT_V6)
{
if ((config->flags & CONFIG_ADDR6) && is_same_net6(&config->addr6, &context->start6, context->prefix))
return 1;
}
else
#endif
if ((config->flags & CONFIG_ADDR) && is_same_net(config->addr, context->start, context->netmask))
return 1; return 1;
for (; context; context = context->current)
if (is_same_net(config->addr, context->start, context->netmask))
return 1;
}
#ifdef HAVE_DHCP6
else
{
if (!(config->flags & CONFIG_ADDR6) || (config->flags & CONFIG_WILDCARD))
return 1;
for (; context; context = context->current)
if (is_same_net6(&config->addr6, &context->start6, context->prefix))
return 1;
}
#endif
return 0; return 0;
} }

View File

@@ -644,20 +644,20 @@ size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source)
int len; int len;
void *addrp; void *addrp;
if (source->sa.sa_family == AF_INET)
{
opt->family = htons(1);
opt->source_netmask = daemon->addr4_netmask;
addrp = &source->in.sin_addr;
}
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
else if (source->sa.sa_family == AF_INET6)
{ {
opt->family = htons(2); opt->family = htons(2);
opt->source_netmask = daemon->addr6_netmask; opt->source_netmask = daemon->addr6_netmask;
addrp = &source->in6.sin6_addr; addrp = &source->in6.sin6_addr;
} }
else
#endif #endif
{
opt->family = htons(1);
opt->source_netmask = daemon->addr4_netmask;
addrp = &source->in.sin_addr;
}
opt->scope_netmask = 0; opt->scope_netmask = 0;
len = 0; len = 0;