Wildcard IPv6 addresses in --dhcp-host, for constructed ranges.

This commit is contained in:
Simon Kelley
2013-01-17 16:34:16 +00:00
parent 459380965a
commit 30393100c1
4 changed files with 27 additions and 4 deletions

View File

@@ -717,7 +717,13 @@ A single
.B dhcp-host .B dhcp-host
may contain an IPv4 address or an IPv6 address, or both. IPv6 addresses must be bracketed by square brackets thus: may contain an IPv4 address or an IPv6 address, or both. IPv6 addresses must be bracketed by square brackets thus:
.B --dhcp-host=laptop,[1234::56] .B --dhcp-host=laptop,[1234::56]
Note that in IPv6 DHCP, the hardware address is not normally available, so a client must be identified by client-id (called client DUID in IPv6-land) or hostname. IPv6 addresses may contain only the host-identifier part:
.B --dhcp-host=laptop,[::56]
in which case thay act as wildcards in constructed dhcp ranges, with
the appropriate network part inserted.
Note that in IPv6 DHCP, the hardware address is not normally
available, so a client must be identified by client-id (called client
DUID in IPv6-land) or hostname.
The special option id:* means "ignore any client-id The special option id:* means "ignore any client-id
and use MAC addresses only." This is useful when a client presents a client-id sometimes and use MAC addresses only." This is useful when a client presents a client-id sometimes

View File

@@ -399,8 +399,16 @@ struct dhcp_context *narrow_context6(struct dhcp_context *context,
static int is_config_in_context6(struct dhcp_context *context, struct dhcp_config *config) static int is_config_in_context6(struct dhcp_context *context, struct dhcp_config *config)
{ {
if (!context) /* called via find_config() from lease_update_from_configs() */ /* expand wildcard on contructed contexts */
return 1; if ((config->flags & CONFIG_WILDCARD) &&
(context->flags & CONTEXT_CONSTRUCTED))
{
u64 addrpart = addr6part(&config->addr6);
config->addr6 = context->start6;
setaddr6part(&config->addr6, addrpart);
return 1;
}
if (!(config->flags & CONFIG_ADDR6) || is_addr_in_context6(context, &config->addr6)) if (!(config->flags & CONFIG_ADDR6) || is_addr_in_context6(context, &config->addr6))
return 1; return 1;

View File

@@ -593,6 +593,7 @@ struct dhcp_config {
#define CONFIG_DECLINED 1024 /* address declined by client */ #define CONFIG_DECLINED 1024 /* address declined by client */
#define CONFIG_BANK 2048 /* from dhcp hosts file */ #define CONFIG_BANK 2048 /* from dhcp hosts file */
#define CONFIG_ADDR6 4096 #define CONFIG_ADDR6 4096
#define CONFIG_WILDCARD 8192
struct dhcp_opt { struct dhcp_opt {
int opt, len, flags; int opt, len, flags;

View File

@@ -2469,6 +2469,14 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
if (!inet_pton(AF_INET6, arg, &new->addr6)) if (!inet_pton(AF_INET6, arg, &new->addr6))
ret_err(_("bad IPv6 address")); ret_err(_("bad IPv6 address"));
for (i= 0; i < 8; i++)
if (new->addr6.s6_addr[i] != 0)
break;
/* set WILDCARD if network part all zeros */
if (i == 8)
new->flags |= CONFIG_WILDCARD;
new->flags |= CONFIG_ADDR6; new->flags |= CONFIG_ADDR6;
} }
#endif #endif