mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-06 15:51:41 +00:00
Compare commits
6
Commits
v2.66test6
...
v2.66test9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21bac1bccd | ||
|
|
b1a1b6def5 | ||
|
|
baeb3adf21 | ||
|
|
39f6a04ca4 | ||
|
|
37c9ccebd1 | ||
|
|
71c73ac17c |
No files matched your search
@@ -14,6 +14,9 @@ version 2.66
|
|||||||
dnsmasq configuration file or restart the daemon. Thanks to
|
dnsmasq configuration file or restart the daemon. Thanks to
|
||||||
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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-44
@@ -679,7 +679,7 @@ void log_context(int family, struct dhcp_context *context)
|
|||||||
|
|
||||||
void *start = &context->start;
|
void *start = &context->start;
|
||||||
void *end = &context->end;
|
void *end = &context->end;
|
||||||
char *n = "", *m = "", *p = daemon->namebuff;
|
char *template = "", *p = daemon->namebuff;
|
||||||
|
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
|
||||||
@@ -694,67 +694,59 @@ void log_context(int family, struct dhcp_context *context)
|
|||||||
end = &context->end6;
|
end = &context->end6;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((context->flags & CONTEXT_DHCP) ||
|
if (family != AF_INET && (context->flags & CONTEXT_DEPRECATE))
|
||||||
!(context->flags & (CONTEXT_CONSTRUCTED | CONTEXT_TEMPLATE)))
|
strcpy(daemon->namebuff, _(", prefix deprecated"));
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (family != AF_INET && (context->flags & CONTEXT_DEPRECATE))
|
p += sprintf(p, _(", lease time "));
|
||||||
strcpy(daemon->namebuff, _(", prefix deprecated"));
|
prettyprint_time(p, context->lease_time);
|
||||||
else
|
p += strlen(p);
|
||||||
{
|
}
|
||||||
p += sprintf(p, _(", lease time "));
|
|
||||||
m = p;
|
|
||||||
prettyprint_time(p, context->lease_time);
|
|
||||||
p += strlen(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
if (context->flags & CONTEXT_CONSTRUCTED)
|
if (context->flags & CONTEXT_CONSTRUCTED)
|
||||||
{
|
{
|
||||||
char ifrn_name[IFNAMSIZ];
|
char ifrn_name[IFNAMSIZ];
|
||||||
if (indextoname(daemon->doing_dhcp6 ? daemon->dhcp6fd : daemon->icmp6fd, context->if_index, ifrn_name))
|
|
||||||
{
|
template = p;
|
||||||
n = p;
|
p += sprintf(p, ", ");
|
||||||
p += sprintf(p, ", constructed for %s", ifrn_name);
|
|
||||||
}
|
if (indextoname(daemon->doing_dhcp6 ? daemon->dhcp6fd : daemon->icmp6fd, context->if_index, ifrn_name))
|
||||||
}
|
sprintf(p, "constructed for %s", ifrn_name);
|
||||||
|
}
|
||||||
if (context->flags & CONTEXT_TEMPLATE)
|
else if (context->flags & CONTEXT_TEMPLATE)
|
||||||
{
|
{
|
||||||
n = p;
|
template = p;
|
||||||
p += sprintf(p, ", template for %s%s", context->template_interface,
|
p += sprintf(p, ", ");
|
||||||
(context->flags & CONTEXT_WILDCARD) ? "*" : "");
|
|
||||||
}
|
sprintf(p, "template for %s%s", context->template_interface,
|
||||||
|
(context->flags & CONTEXT_WILDCARD) ? "*" : "");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((context->flags & CONTEXT_DHCP) || family == AF_INET)
|
if ((context->flags & CONTEXT_DHCP) || family == AF_INET)
|
||||||
{
|
{
|
||||||
inet_ntop(family, start, daemon->dhcp_buff, 256);
|
inet_ntop(family, start, daemon->dhcp_buff, 256);
|
||||||
inet_ntop(family, end, daemon->dhcp_buff3, 256);
|
inet_ntop(family, end, daemon->dhcp_buff3, 256);
|
||||||
my_syslog(MS_DHCP | LOG_INFO,
|
my_syslog(MS_DHCP | LOG_INFO,
|
||||||
(context->flags & CONTEXT_RA_STATELESS) ?
|
(context->flags & CONTEXT_RA_STATELESS) ?
|
||||||
_("%s stateless on %s%.0s%.0s") :
|
_("%s stateless on %s%.0s%.0s%s") :
|
||||||
(context->flags & CONTEXT_STATIC) ?
|
(context->flags & CONTEXT_STATIC) ?
|
||||||
_("%s, static leases only on %.0s%s%s") :
|
_("%s, static leases only on %.0s%s%s%.0s") :
|
||||||
(context->flags & CONTEXT_PROXY) ?
|
(context->flags & CONTEXT_PROXY) ?
|
||||||
_("%s, proxy on subnet %.0s%s%.0s") :
|
_("%s, proxy on subnet %.0s%s%.0s%.0s") :
|
||||||
_("%s, IP range %s -- %s%s"),
|
_("%s, IP range %s -- %s%s%.0s"),
|
||||||
(family != AF_INET) ? "DHCPv6" : "DHCP",
|
(family != AF_INET) ? "DHCPv6" : "DHCP",
|
||||||
daemon->dhcp_buff, daemon->dhcp_buff3, daemon->namebuff);
|
daemon->dhcp_buff, daemon->dhcp_buff3, daemon->namebuff, template);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
if (context->flags & CONTEXT_RA_NAME)
|
if (context->flags & CONTEXT_RA_NAME)
|
||||||
my_syslog(MS_DHCP | LOG_INFO, _("DHCPv4-derived IPv6 names on %s%s"),
|
my_syslog(MS_DHCP | LOG_INFO, _("DHCPv4-derived IPv6 names on %s%s"), daemon->addrbuff, template);
|
||||||
daemon->addrbuff, n);
|
|
||||||
|
|
||||||
|
|
||||||
if (context->flags & CONTEXT_RA)
|
if ((context->flags & CONTEXT_RA) || (option_bool(OPT_RA) && (context->flags & CONTEXT_DHCP) && family == AF_INET6))
|
||||||
my_syslog(MS_DHCP | LOG_INFO, _("router advertisement on %s%s%s"),
|
my_syslog(MS_DHCP | LOG_INFO, _("router advertisement on %s%s"), daemon->addrbuff, template);
|
||||||
daemon->addrbuff,
|
|
||||||
(context->flags & (CONTEXT_CONSTRUCTED | CONTEXT_TEMPLATE)) ? "" : ", prefix valid ",
|
|
||||||
(context->flags & (CONTEXT_CONSTRUCTED | CONTEXT_TEMPLATE)) ? n : m);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-16
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
+39
-31
@@ -82,18 +82,20 @@ 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;
|
||||||
|
|
||||||
|
if (!IN6_IS_ADDR_LOOPBACK(link_address) &&
|
||||||
|
!IN6_IS_ADDR_LINKLOCAL(link_address) &&
|
||||||
|
!IN6_IS_ADDR_MULTICAST(link_address))
|
||||||
|
for (c = daemon->dhcp6; c; c = c->next)
|
||||||
|
if ((c->flags & CONTEXT_DHCP) &&
|
||||||
|
!(c->flags & CONTEXT_TEMPLATE) &&
|
||||||
|
is_same_net6(link_address, &c->start6, c->prefix) &&
|
||||||
|
is_same_net6(link_address, &c->end6, c->prefix))
|
||||||
|
{
|
||||||
|
c->current = context;
|
||||||
|
context = c;
|
||||||
|
}
|
||||||
|
|
||||||
for (c = daemon->dhcp6; c; c = c->next)
|
|
||||||
if (!IN6_IS_ADDR_LOOPBACK(link_address) &&
|
|
||||||
!IN6_IS_ADDR_LINKLOCAL(link_address) &&
|
|
||||||
!IN6_IS_ADDR_MULTICAST(link_address) &&
|
|
||||||
is_same_net6(link_address, &c->start6, c->prefix) &&
|
|
||||||
is_same_net6(link_address, &c->end6, c->prefix))
|
|
||||||
{
|
|
||||||
c->current = context;
|
|
||||||
context = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!context)
|
if (!context)
|
||||||
{
|
{
|
||||||
inet_ntop(AF_INET6, link_address, daemon->addrbuff, ADDRSTRLEN);
|
inet_ntop(AF_INET6, link_address, daemon->addrbuff, ADDRSTRLEN);
|
||||||
@@ -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) &&
|
|
||||||
(!have_config(config, CONFIG_ADDR6) || memcmp(&config->addr6, req_addr, IN6ADDRSZ) != 0))
|
if ((dynamic = address6_available(context, req_addr, tags)) || address6_valid(context, req_addr, tags))
|
||||||
{
|
{
|
||||||
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
|
||||||
{
|
{
|
||||||
@@ -567,9 +575,9 @@ static int dhcp6_no_relay(int msg_type, struct in6_addr *link_address, struct dh
|
|||||||
inet_ntop(AF_INET6, &config->addr6, daemon->addrbuff, ADDRSTRLEN);
|
inet_ntop(AF_INET6, &config->addr6, daemon->addrbuff, ADDRSTRLEN);
|
||||||
|
|
||||||
if (ltmp && ltmp->clid &&
|
if (ltmp && ltmp->clid &&
|
||||||
(ltmp->clid_len != clid_len || memcmp(ltmp->clid, clid, clid_len) != 0))
|
(ltmp->clid_len != clid_len || memcmp(ltmp->clid, clid, clid_len) != 0 || ltmp->hwaddr_type != iaid))
|
||||||
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"),
|
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s:%d"),
|
||||||
daemon->addrbuff, print_mac(daemon->namebuff, ltmp->clid, ltmp->clid_len));
|
daemon->addrbuff, print_mac(daemon->namebuff, ltmp->clid, ltmp->clid_len), lease->hwaddr_type);
|
||||||
else if (have_config(config, CONFIG_DECLINED) &&
|
else if (have_config(config, CONFIG_DECLINED) &&
|
||||||
difftime(now, config->decline_time) < (float)DECLINE_BACKOFF)
|
difftime(now, config->decline_time) < (float)DECLINE_BACKOFF)
|
||||||
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"),
|
my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"),
|
||||||
|
|||||||
Reference in new issue
Block a user