- struct sockaddr_in6 dest = {
- .sin6_family = AF_INET6,
- .sin6_addr = *addr,
- .sin6_scope_id = iface->ifindex,
- };
- odhcpd_send(router_event.uloop.fd, &dest, data, RA_IOV_LEN, iface);
+ 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;