Fix e7bfd556c0 to actually work.

This commit is contained in:
Simon Kelley
2019-01-09 17:57:56 +00:00
parent 2896e2485e
commit 9c0d445ef4
2 changed files with 26 additions and 30 deletions

View File

@@ -754,19 +754,6 @@ int address_allocate(struct dhcp_context *context,
if (addr.s_addr == d->router.s_addr) if (addr.s_addr == d->router.s_addr)
break; break;
/* in consec-ip mode, skip addresses equal to
the number of addresses rejected by clients. This
should avoid the same client being offered the same
address after it has rjected it. */
if (option_bool(OPT_CONSEC_ADDR))
{
if (c->addr_epoch)
{
c->addr_epoch--;
d = context; /* d non-NULL skips the address. */
}
}
/* Addresses which end in .255 and .0 are broken in Windows even when using /* Addresses which end in .255 and .0 are broken in Windows even when using
supernetting. ie dhcp-range=192.168.0.1,192.168.1.254,255,255,254.0 supernetting. ie dhcp-range=192.168.0.1,192.168.1.254,255,255,254.0
then 192.168.0.255 is a valid IP address, but not for Windows as it's then 192.168.0.255 is a valid IP address, but not for Windows as it's
@@ -778,24 +765,33 @@ int address_allocate(struct dhcp_context *context,
(!IN_CLASSC(ntohl(addr.s_addr)) || (!IN_CLASSC(ntohl(addr.s_addr)) ||
((ntohl(addr.s_addr) & 0xff) != 0xff && ((ntohl(addr.s_addr) & 0xff) != 0x0)))) ((ntohl(addr.s_addr) & 0xff) != 0xff && ((ntohl(addr.s_addr) & 0xff) != 0x0))))
{ {
struct ping_result *r; /* in consec-ip mode, skip addresses equal to
the number of addresses rejected by clients. This
if ((r = do_icmp_ping(now, addr, j, loopback))) should avoid the same client being offered the same
{ address after it has rjected it. */
/* consec-ip mode: we offered this address for another client if (option_bool(OPT_CONSEC_ADDR) && c->addr_epoch)
(different hash) recently, don't offer it to this one. */ c->addr_epoch--;
if (!option_bool(OPT_CONSEC_ADDR) || r->hash == j)
{
*addrp = addr;
return 1;
}
}
else else
{ {
/* address in use: perturb address selection so that we are struct ping_result *r;
less likely to try this address again. */
if (!option_bool(OPT_CONSEC_ADDR)) if ((r = do_icmp_ping(now, addr, j, loopback)))
c->addr_epoch++; {
/* consec-ip mode: we offered this address for another client
(different hash) recently, don't offer it to this one. */
if (!option_bool(OPT_CONSEC_ADDR) || r->hash == j)
{
*addrp = addr;
return 1;
}
}
else
{
/* address in use: perturb address selection so that we are
less likely to try this address again. */
if (!option_bool(OPT_CONSEC_ADDR))
c->addr_epoch++;
}
} }
} }

View File

@@ -436,7 +436,7 @@ struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned c
skip addresses equal to the number of addresses rejected skip addresses equal to the number of addresses rejected
by clients. This should avoid the same client being offered the same by clients. This should avoid the same client being offered the same
address after it has rjected it. */ address after it has rjected it. */
start = lease_find_max_addr6(c) + serial + c->addr_epoch; start = lease_find_max_addr6(c) + 1 + serial + c->addr_epoch;
if (c->addr_epoch) if (c->addr_epoch)
c->addr_epoch--; c->addr_epoch--;
} }