summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2014-07-13 22:12:45 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2014-07-13 22:18:57 +0100
commit6d8e8ac0fa82c9cb771a3b54275589bc197e777a (patch)
tree9672b6b2bf208142b3599472810b2e27e4ad3124
parent24b167ada814875df3cf43a5084627755ad912c5 (diff)
downloaddnsmasq-6d8e8ac0fa82c9cb771a3b54275589bc197e777a.tar.gz
Tidy up previous commit.
-rw-r--r--CHANGELOG6
-rw-r--r--src/dnsmasq.h1
-rw-r--r--src/lease.c32
-rw-r--r--src/util.c11
4 files changed, 27 insertions, 23 deletions
diff --git a/CHANGELOG b/CHANGELOG
index f59e7c5..5b7dfb8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,6 +14,12 @@ version 2.72
Fix failure to build against Nettle-3.0. Thanks to Steven
Barth for spotting this and finding the fix.
+ When assigning existing DHCP leases to intefaces by comparing
+ networks, handle the case that two or more interfaces have the
+ same network part, but different prefix lengths (favour the
+ longer prefix length.) Thanks to Lung-Pin Chang for the
+ patch.
+
version 2.71
Subtle change to error handling to help DNSSEC validation
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index 8e103d3..e70d10a 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -1247,7 +1247,6 @@ char *host_from_dns(struct in_addr addr);
#ifdef HAVE_DHCP
void lease_update_file(time_t now);
void lease_update_dns(int force);
-void lease_update_interface(time_t now);
void lease_init(time_t now);
struct dhcp_lease *lease4_allocate(struct in_addr addr);
#ifdef HAVE_DHCP6
diff --git a/src/lease.c b/src/lease.c
index 9479afc..5d56b1b 100644
--- a/src/lease.c
+++ b/src/lease.c
@@ -352,20 +352,20 @@ static int find_interface_v4(struct in_addr local, int if_index, char *label,
struct in_addr netmask, struct in_addr broadcast, void *vparam)
{
struct dhcp_lease *lease;
- int prefix;
+ int prefix = netmask_length(netmask);
(void) label;
(void) broadcast;
(void) vparam;
for (lease = leases; lease; lease = lease->next)
- if (!(lease->flags & (LEASE_TA | LEASE_NA))) {
- prefix = netmask_length(netmask);
- if (is_same_net(local, lease->addr, netmask) && prefix > lease->new_prefixlen) {
- lease->new_interface = if_index;
+ if (!(lease->flags & (LEASE_TA | LEASE_NA)) &&
+ is_same_net(local, lease->addr, netmask) &&
+ prefix > lease->new_prefixlen)
+ {
+ lease->new_interface = if_index;
lease->new_prefixlen = prefix;
}
- }
return 1;
}
@@ -425,11 +425,19 @@ void lease_update_slaac(time_t now)
start-time. */
void lease_find_interfaces(time_t now)
{
+ struct dhcp_lease *lease;
+
+ for (lease = leases; lease; lease = lease->next)
+ lease->new_prefixlen = lease->new_interface = 0;
+
iface_enumerate(AF_INET, &now, find_interface_v4);
#ifdef HAVE_DHCP6
iface_enumerate(AF_INET6, &now, find_interface_v6);
#endif
- lease_update_interface(now);
+
+ for (lease = leases; lease; lease = lease->next)
+ if (lease->new_interface != 0)
+ lease_set_interface(lease, lease->new_interface, now);
}
#ifdef HAVE_DHCP6
@@ -504,16 +512,6 @@ void lease_update_dns(int force)
}
}
-void lease_update_interface(time_t now)
-{
- struct dhcp_lease *lease;
-
- for (lease = leases; lease; lease = lease->next)
- if (lease->new_interface > 0) {
- lease_set_interface(lease, lease->new_interface, now);
- }
-}
-
void lease_prune(struct dhcp_lease *target, time_t now)
{
struct dhcp_lease *lease, *tmp, **up;
diff --git a/src/util.c b/src/util.c
index c1b0c50..660347f 100644
--- a/src/util.c
+++ b/src/util.c
@@ -323,11 +323,12 @@ int netmask_length(struct in_addr mask)
{
int zero_count = 0;
- while (0x0 == (mask.s_addr & 0x1)) {
- mask.s_addr >>= 1;
- ++zero_count;
- }
-
+ while (0x0 == (mask.s_addr & 0x1) && zero_count < 32)
+ {
+ mask.s_addr >>= 1;
+ zero_count++;
+ }
+
return 32 - zero_count;
}