Commit de92b479 authored by Simon Kelley's avatar Simon Kelley

Make wildcard-configured addresses work on multiple networks.

parent 0f128eb5
...@@ -371,31 +371,38 @@ struct dhcp_context *address6_valid(struct dhcp_context *context, ...@@ -371,31 +371,38 @@ struct dhcp_context *address6_valid(struct dhcp_context *context,
return NULL; return NULL;
} }
static int is_config_in_context6(struct dhcp_context *context, struct dhcp_config *config) int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr)
{ {
/* expand wildcard on contructed contexts */ if (!config || !(config->flags & CONFIG_ADDR6))
if ((config->flags & CONFIG_WILDCARD) && return 0;
(context->flags & CONTEXT_CONSTRUCTED))
if ((config->flags & CONFIG_WILDCARD) && context->prefix == 64)
{ {
u64 addrpart = addr6part(&config->addr6); *addr = context->start6;
config->addr6 = context->start6; setaddr6part(addr, addr6part(&config->addr6));
setaddr6part(&config->addr6, addrpart); return 1;
}
if (is_same_net6(&context->start6, &config->addr6, context->prefix))
{
*addr = config->addr6;
return 1; return 1;
} }
if (!(config->flags & CONFIG_ADDR6) || is_addr_in_context6(context, &config->addr6))
return 1;
return 0; return 0;
} }
static int is_config_in_context6(struct dhcp_context *context, struct dhcp_config *config)
int is_addr_in_context6(struct dhcp_context *context, struct in6_addr *addr)
{ {
if (!(config->flags & CONFIG_ADDR6) ||
(config->flags & CONFIG_WILDCARD))
return 1;
for (; context; context = context->current) for (; context; context = context->current)
if (is_same_net6(addr, &context->start6, context->prefix)) if (is_same_net6(&config->addr6, &context->start6, context->prefix))
return 1; return 1;
return 0; return 0;
} }
......
...@@ -723,6 +723,7 @@ struct dhcp_context { ...@@ -723,6 +723,7 @@ struct dhcp_context {
#define CONTEXT_RA 8192 #define CONTEXT_RA 8192
#define CONTEXT_WILDCARD 16384 #define CONTEXT_WILDCARD 16384
#define CONTEXT_USED 32768 #define CONTEXT_USED 32768
#define CONTEXT_CONF_USED 65536
struct ping_result { struct ping_result {
struct in_addr addr; struct in_addr addr;
...@@ -1175,7 +1176,7 @@ void dhcp6_init(void); ...@@ -1175,7 +1176,7 @@ void dhcp6_init(void);
void dhcp6_packet(time_t now); void dhcp6_packet(time_t now);
struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned char *clid, int clid_len, struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned char *clid, int clid_len,
int iaid, int serial, struct dhcp_netid *netids, int plain_range, struct in6_addr *ans); int iaid, int serial, struct dhcp_netid *netids, int plain_range, struct in6_addr *ans);
int is_addr_in_context6(struct dhcp_context *context, struct in6_addr *addr); int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr);
struct dhcp_context *address6_available(struct dhcp_context *context, struct dhcp_context *address6_available(struct dhcp_context *context,
struct in6_addr *taddr, struct in6_addr *taddr,
struct dhcp_netid *netids, struct dhcp_netid *netids,
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment