mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
Wildcard IPv6 addresses in --dhcp-host, for constructed ranges.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
14
src/dhcp6.c
14
src/dhcp6.c
@@ -399,11 +399,19 @@ 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;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -2468,6 +2468,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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user