Without this, all the clients get the same timeouts and try to renew
addresses at the same time. Reduce the T1 & T2 by a pseudo random 0 to
127 seconds, thus the renew attempts are likely to be spread out a bit
in time.
Signed-off-by: Kevin Darbyshire-Bryant <[email protected]>
/* UINT32_MAX is RFC defined as infinite lease-time */
a->preferred_until = (floor_preferred_lifetime == UINT32_MAX) ? 0 : floor_preferred_lifetime + now;
- o_ia.t1 = htonl((floor_preferred_lifetime == UINT32_MAX) ? floor_preferred_lifetime : floor_preferred_lifetime * 5 / 10);
- o_ia.t2 = htonl((floor_preferred_lifetime == UINT32_MAX) ? floor_preferred_lifetime : floor_preferred_lifetime * 8 / 10);
+ /* if there's sufficient time left, subtract a pseudo random 127 seconds from the refresh timers */
+ o_ia.t1 = htonl((floor_preferred_lifetime == UINT32_MAX) ? floor_preferred_liftime : (floor_preferred_liftime > 256) ?
+ floor_preferred_lifetime * 5 / 10 - ((rand() >> 8) & 0x7f) : floor_preferred_lifetime * 5 / 10);
+ o_ia.t2 = htonl((floor_preferred_lifetime == UINT32_MAX) ? floor_preferred_lifetime : (floor_preferred_lifetime > 256) ?
+ floor_preferred_lifetime * 8 / 10 - ((rand() >> 8) & 0x7f) : floor_preferred_lifetime * 8 / 10);
if (!o_ia.t1)
o_ia.t1 = htonl(1);