diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2014-07-13 22:12:45 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2014-07-13 22:18:57 +0100 |
commit | 6d8e8ac0fa82c9cb771a3b54275589bc197e777a (patch) | |
tree | 9672b6b2bf208142b3599472810b2e27e4ad3124 | |
parent | 24b167ada814875df3cf43a5084627755ad912c5 (diff) | |
download | dnsmasq-6d8e8ac0fa82c9cb771a3b54275589bc197e777a.tar.gz |
Tidy up previous commit.
-rw-r--r-- | CHANGELOG | 6 | ||||
-rw-r--r-- | src/dnsmasq.h | 1 | ||||
-rw-r--r-- | src/lease.c | 32 | ||||
-rw-r--r-- | src/util.c | 11 |
4 files changed, 27 insertions, 23 deletions
@@ -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; @@ -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; } |