+static int calc_adv_interval(struct interface *iface, uint32_t minvalid,
+ uint32_t *maxival)
+{
+ uint32_t minival = iface->ra_mininterval;
+ int msecs;
+
+ *maxival = iface->ra_maxinterval;
+
+ if (*maxival > minvalid/3)
+ *maxival = minvalid/3;
+
+ if (*maxival > MaxRtrAdvInterval)
+ *maxival = MaxRtrAdvInterval;
+ else if (*maxival < 4)
+ *maxival = 4;
+
+ if (minival < MinRtrAdvInterval)
+ minival = MinRtrAdvInterval;
+ else if (minival > (*maxival * 3)/4)
+ minival = (*maxival >= 9 ? *maxival/3 : *maxival);
+
+ odhcpd_urandom(&msecs, sizeof(msecs));
+ msecs = (labs(msecs) % ((*maxival != minival) ? (*maxival - minival)*1000 : 500)) +
+ minival*1000;
+
+ return msecs;
+}
+
+static uint16_t calc_ra_lifetime(struct interface *iface, uint32_t maxival)
+{
+ uint16_t lifetime = 3*maxival;
+
+ if (iface->ra_lifetime >= 0) {
+ lifetime = iface->ra_lifetime;
+ if (lifetime < maxival)
+ lifetime = maxival;
+ else if (lifetime > 9000)
+ lifetime = 9000;
+ }
+
+ return lifetime;
+}