+
+}
+
+static void
+interface_ip_valid_until_handler(struct uloop_timeout *t)
+{
+ time_t now = system_get_rtime();
+ struct interface *iface;
+ vlist_for_each_element(&interfaces, iface, node) {
+ if (iface->state != IFS_UP)
+ continue;
+
+ struct device_addr *addr, *addrp;
+ struct device_route *route, *routep;
+ struct device_prefix *pref, *prefp;
+
+ vlist_for_each_element_safe(&iface->proto_ip.addr, addr, node, addrp)
+ if (addr->valid_until && addr->valid_until < now)
+ vlist_delete(&iface->proto_ip.addr, &addr->node);
+
+ vlist_for_each_element_safe(&iface->proto_ip.route, route, node, routep)
+ if (route->valid_until && route->valid_until < now)
+ vlist_delete(&iface->proto_ip.route, &route->node);
+
+ vlist_for_each_element_safe(&iface->proto_ip.prefix, pref, node, prefp)
+ if (pref->valid_until && pref->valid_until < now)
+ vlist_delete(&iface->proto_ip.prefix, &pref->node);
+
+ }
+
+ uloop_timeout_set(t, 1000);
+}
+
+static void __init
+interface_ip_init_worker(void)
+{
+ valid_until_timeout.cb = interface_ip_valid_until_handler;
+ uloop_timeout_set(&valid_until_timeout, 1000);