From 1418fd1103e61f426d8d38776029e25e7788b3da Mon Sep 17 00:00:00 2001 From: David Hankins Date: Thu, 27 Sep 2007 15:28:05 +0000 Subject: [PATCH] - 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] --- RELNOTES | 10 ++++++++++ server/failover.c | 16 ++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/RELNOTES b/RELNOTES index a6a7eb44..8464f453 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 a2b27004..83719554 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));