Don't BIND DHCP socket if more interfaces may come along later.

This commit is contained in:
Simon Kelley
2013-05-31 17:04:25 +01:00
parent 921360ce62
commit e2ba0df2d4
2 changed files with 19 additions and 7 deletions

View File

@@ -50,6 +50,12 @@ version 2.67
Log when the maximum number of concurrent DNS queries is Log when the maximum number of concurrent DNS queries is
reached. Thanks to Marcelo Salhab Brogliato for the patch. reached. Thanks to Marcelo Salhab Brogliato for the patch.
If wildcards are used in --interface, don't assume that
there will only ever be one available interface for DHCP
just because there is one at start-up. More may appear, so
we can't use SO_BINDTODEVICE. Thanks to Natrio for the bug
report.
version 2.66 version 2.66
Add the ability to act as an authoritative DNS Add the ability to act as an authoritative DNS

View File

@@ -347,21 +347,27 @@ void bindtodevice(int fd)
to that device. This is for the use case of (eg) OpenStack, which runs a new to that device. This is for the use case of (eg) OpenStack, which runs a new
dnsmasq instance for each VLAN interface it creates. Without the BINDTODEVICE, dnsmasq instance for each VLAN interface it creates. Without the BINDTODEVICE,
individual processes don't always see the packets they should. individual processes don't always see the packets they should.
SO_BINDTODEVICE is only available Linux. */ SO_BINDTODEVICE is only available Linux.
Note that if wildcards are used in --interface, or a configured interface doesn't
yet exist, then more interfaces may arrive later, so we can't safely assert there
is only one interface and proceed.
*/
struct irec *iface, *found; struct irec *iface, *found;
struct iname *if_tmp;
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
if (if_tmp->name && (!if_tmp->used || strchr(if_tmp->name, '*')))
return;
for (found = NULL, iface = daemon->interfaces; iface; iface = iface->next) for (found = NULL, iface = daemon->interfaces; iface; iface = iface->next)
if (iface->dhcp_ok) if (iface->dhcp_ok)
{ {
if (!found) if (!found)
found = iface; found = iface;
else if (strcmp(found->name, iface->name) != 0) else if (strcmp(found->name, iface->name) != 0)
{ return; /* more than one. */
/* more than one. */
found = NULL;
break;
}
} }
if (found) if (found)