From: David Hankins Date: Thu, 27 Sep 2007 15:28:05 +0000 (+0000) Subject: - A bug was repaired where MAC Address Affinity for virgin leases always X-Git-Tag: v4_0_0b1~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1418fd1103e61f426d8d38776029e25e7788b3da;p=thirdparty%2Fdhcp.git - A bug was repaired where MAC Address Affinity for virgin leases always mapped to the primary. Virgin leases now have an interleaved preference between primary and secondary. [ISC-Bugs #17174] - A bug was repaired where MAC Address Affinity for clients with no client identifier was sometimes mishashed to the peer. Load balancing during runtime and pool rebalancing were opposing. [ISC-Bugs #17174] --- diff --git a/RELNOTES b/RELNOTES index a6a7eb44f..8464f4535 100644 --- a/RELNOTES +++ b/RELNOTES @@ -213,6 +213,16 @@ suggested fixes to . were transmitted to it, and what frames are being carried through it which it should not intercept. + Changes since 3.1.0 (Maintenance) + +- A bug was repaired where MAC Address Affinity for virgin leases always + mapped to the primary. Virgin leases now have an interleaved preference + between primary and secondary. + +- A bug was repaired where MAC Address Affinity for clients with no client + identifier was sometimes mishashed to the peer. Load balancing during + runtime and pool rebalancing were opposing. + Changes since 3.1.0rc1 - The parse warning that 'deny dyanmic bootp;' must be configured for diff --git a/server/failover.c b/server/failover.c index a2b270049..837195545 100644 --- a/server/failover.c +++ b/server/failover.c @@ -5502,10 +5502,18 @@ peer_wants_lease(struct lease *lp) return 0; if (lp->uid_len) - hbaix = loadb_p_hash (lp->uid, lp->uid_len); - else - hbaix = loadb_p_hash (lp->hardware_addr.hbuf, - lp->hardware_addr.hlen); + hbaix = loadb_p_hash(lp->uid, lp->uid_len); + else if (lp->hardware_addr.hlen > 1) + /* Skip the first byte, which is the hardware type, and is + * not included during actual load balancing checks above + * since it is separate from the packet header chaddr field. + * The remainder of the hardware address should be identical + * to the chaddr contents. + */ + hbaix = loadb_p_hash(lp->hardware_addr.hbuf + 1, + lp->hardware_addr.hlen - 1); + else /* Consistent 50/50 split */ + return(lp->ip_addr.iabuf[lp->ip_addr.len-1] & 0x01); hm = state->hba[(hbaix >> 3) & 0x1F] & (1 << (hbaix & 0x07));