Compare commits

...
4 Commits
5 changed files with 68 additions and 43 deletions

No files matched your search

+3
View File
@@ -15,6 +15,9 @@ version 2.66
Steven Barth for extensive testing and development work on Steven Barth for extensive testing and development work on
this idea. this idea.
Fix crash on startup on Solaris 11. Regression probably
introduced in 2.61. Thanks to Geoff Johnstone for the patch.
version 2.65 version 2.65
Fix regression which broke forwarding of queries sent via Fix regression which broke forwarding of queries sent via
+5 -2
View File
@@ -111,7 +111,7 @@ int iface_enumerate(int family, void *parm, int (*callback)())
{ {
int iface_index = if_nametoindex(addrs->ifa_name); int iface_index = if_nametoindex(addrs->ifa_name);
if (iface_index == 0) if (iface_index == 0 || !addrs->ifa_addr || !addrs->ifa_netmask)
continue; continue;
if (family == AF_INET) if (family == AF_INET)
@@ -119,7 +119,10 @@ int iface_enumerate(int family, void *parm, int (*callback)())
struct in_addr addr, netmask, broadcast; struct in_addr addr, netmask, broadcast;
addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr; addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr;
netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr; netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr;
broadcast = ((struct sockaddr_in *) addrs->ifa_broadaddr)->sin_addr; if (addrs->ifa_broadaddr)
broadcast = ((struct sockaddr_in *) addrs->ifa_broadaddr)->sin_addr;
else
broadcast.s_addr = 0;
if (!((*callback)(addr, iface_index, netmask, broadcast, parm))) if (!((*callback)(addr, iface_index, netmask, broadcast, parm)))
goto err; goto err;
} }
+24 -16
View File
@@ -211,7 +211,8 @@ static int complete_context6(struct in6_addr *local, int prefix,
for (context = daemon->dhcp6; context; context = context->next) for (context = daemon->dhcp6; context; context = context->next)
{ {
if (!(context->flags & CONTEXT_TEMPLATE) && if ((context->flags & CONTEXT_DHCP) &&
!(context->flags & CONTEXT_TEMPLATE) &&
prefix == context->prefix && prefix == context->prefix &&
is_same_net6(local, &context->start6, prefix) && is_same_net6(local, &context->start6, prefix) &&
is_same_net6(local, &context->end6, prefix)) is_same_net6(local, &context->end6, prefix))
@@ -328,6 +329,7 @@ int address6_allocate(struct dhcp_context *context, unsigned char *clid, int cl
return 0; return 0;
} }
/* can dynamically allocate 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)
@@ -352,6 +354,21 @@ struct dhcp_context *address6_available(struct dhcp_context *context,
return NULL; return NULL;
} }
/* address OK if configured */
struct dhcp_context *address6_valid(struct dhcp_context *context,
struct in6_addr *taddr,
struct dhcp_netid *netids)
{
struct dhcp_context *tmp;
for (tmp = context; tmp; tmp = tmp->current)
if (is_same_net6(&tmp->start6, taddr, tmp->prefix) &&
match_netid(tmp->filter, netids, 1))
return tmp;
return NULL;
}
struct dhcp_context *narrow_context6(struct dhcp_context *context, struct dhcp_context *narrow_context6(struct dhcp_context *context,
struct in6_addr *taddr, struct in6_addr *taddr,
struct dhcp_netid *netids) struct dhcp_netid *netids)
@@ -366,21 +383,12 @@ struct dhcp_context *narrow_context6(struct dhcp_context *context,
struct dhcp_context *tmp; struct dhcp_context *tmp;
if (!(tmp = address6_available(context, taddr, netids))) if (!(tmp = address6_available(context, taddr, netids)) &&
{ !(tmp = address6_valid(context, taddr, netids)))
for (tmp = context; tmp; tmp = tmp->current) for (tmp = context; tmp; tmp = tmp->current)
if (match_netid(tmp->filter, netids, 1) && if (match_netid(tmp->filter, netids, 1) &&
is_same_net6(taddr, &tmp->start6, tmp->prefix) && is_same_net6(taddr, &tmp->start6, tmp->prefix))
(tmp->flags & CONTEXT_STATIC)) break;
break;
if (!tmp)
for (tmp = context; tmp; tmp = tmp->current)
if (match_netid(tmp->filter, netids, 1) &&
is_same_net6(taddr, &tmp->start6, tmp->prefix) &&
!(tmp->flags & CONTEXT_PROXY))
break;
}
/* Only one context allowed now */ /* Only one context allowed now */
if (tmp) if (tmp)
+3
View File
@@ -1149,6 +1149,9 @@ int is_addr_in_context6(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);
struct dhcp_context *address6_valid(struct dhcp_context *context,
struct in6_addr *taddr,
struct dhcp_netid *netids);
struct dhcp_context *narrow_context6(struct dhcp_context *context, struct dhcp_context *narrow_context6(struct dhcp_context *context,
struct in6_addr *taddr, struct in6_addr *taddr,
struct dhcp_netid *netids); struct dhcp_netid *netids);
+33 -25
View File
@@ -83,16 +83,18 @@ static int dhcp6_maybe_relay(struct in6_addr *link_address, struct dhcp_netid **
struct dhcp_context *c; struct dhcp_context *c;
context = NULL; context = NULL;
for (c = daemon->dhcp6; c; c = c->next) if (!IN6_IS_ADDR_LOOPBACK(link_address) &&
if (!IN6_IS_ADDR_LOOPBACK(link_address) && !IN6_IS_ADDR_LINKLOCAL(link_address) &&
!IN6_IS_ADDR_LINKLOCAL(link_address) && !IN6_IS_ADDR_MULTICAST(link_address))
!IN6_IS_ADDR_MULTICAST(link_address) && for (c = daemon->dhcp6; c; c = c->next)
is_same_net6(link_address, &c->start6, c->prefix) && if ((c->flags & CONTEXT_DHCP) &&
is_same_net6(link_address, &c->end6, c->prefix)) !(c->flags & CONTEXT_TEMPLATE) &&
{ is_same_net6(link_address, &c->start6, c->prefix) &&
c->current = context; is_same_net6(link_address, &c->end6, c->prefix))
context = c; {
} c->current = context;
context = c;
}
if (!context) if (!context)
{ {
@@ -525,32 +527,38 @@ static int dhcp6_no_relay(int msg_type, struct in6_addr *link_address, struct dh
{ {
struct in6_addr *req_addr = opt6_ptr(ia_option, 0); struct in6_addr *req_addr = opt6_ptr(ia_option, 0);
requested_time = opt6_uint(ia_option, 16, 4); requested_time = opt6_uint(ia_option, 16, 4);
struct dhcp_context *dynamic;
if (!address6_available(context, req_addr, tags) && if ((dynamic = address6_available(context, req_addr, tags)) || address6_valid(context, req_addr, tags))
(!have_config(config, CONFIG_ADDR6) || memcmp(&config->addr6, req_addr, IN6ADDRSZ) != 0))
{ {
if (msg_type == DHCP6REQUEST) if (!dynamic && !(have_config(config, CONFIG_ADDR6) && memcmp(&config->addr6, req_addr, IN6ADDRSZ) == 0))
{ {
/* host has a lease, but it's not on the correct link */ /* Static range, not configured. */
o1 = new_opt6(OPTION6_STATUS_CODE); o1 = new_opt6(OPTION6_STATUS_CODE);
put_opt6_short(DHCP6NOTONLINK); put_opt6_short(DHCP6UNSPEC);
put_opt6_string("Not on link"); put_opt6_string("Address unavailable");
end_opt6(o1); end_opt6(o1);
} }
else if (lease6_find_by_addr(req_addr, 128, 0) &&
!(lease = lease6_find(clid, clid_len, ia_type == OPTION6_IA_NA ? LEASE_NA : LEASE_TA, iaid, req_addr)))
{
/* Address leased to another DUID/IAID */
o1 = new_opt6(OPTION6_STATUS_CODE);
put_opt6_short(DHCP6UNSPEC);
put_opt6_string("Address in use");
end_opt6(o1);
}
else
addrp = req_addr;
} }
else if ((lease = lease6_find(NULL, 0, ia_type == OPTION6_IA_NA ? LEASE_NA : LEASE_TA, else if (msg_type == DHCP6REQUEST)
iaid, req_addr)) &&
(clid_len != lease->clid_len ||
memcmp(clid, lease->clid, clid_len) != 0))
{ {
/* Address leased to another DUID */ /* requested address not on the correct link */
o1 = new_opt6(OPTION6_STATUS_CODE); o1 = new_opt6(OPTION6_STATUS_CODE);
put_opt6_short(DHCP6UNSPEC); put_opt6_short(DHCP6NOTONLINK);
put_opt6_string("Address in use"); put_opt6_string("Not on link");
end_opt6(o1); end_opt6(o1);
} }
else
addrp = req_addr;
} }
else else
{ {