+ // Calculate periodic transmit
+ int msecs = 0;
+ uint32_t maxival = MaxRtrAdvInterval * 1000;
+ uint32_t minival = MinRtrAdvInterval * 1000;
+
+ if (maxpreferred > 0 && maxival > maxpreferred / 2) {
+ maxival = maxpreferred / 2;
+ if (maxival < 4000)
+ maxival = 4000;
+
+ if (maxival >= 9000)
+ minival = maxival / 3;
+ else
+ minival = (maxival * 3) / 4;
+ }
+
+ odhcpd_urandom(&msecs, sizeof(msecs));
+ msecs = (labs(msecs) % (maxival - minival)) + minival;
+
+ struct icmpv6_opt adv_interval = {
+ .type = ND_OPT_RTR_ADV_INTERVAL,
+ .len = 1,
+ .data = {0, 0, maxival >> 24, maxival >> 16, maxival >> 8, maxival}
+ };