#include "common.h"
#include "dhcpcd.h"
+#include "eloop.h"
#include "if-options.h"
const char *
return -1;
#endif
}
+
+uint32_t
+lifetime_left(uint32_t lifetime, const struct timespec *acquired, const struct timespec *now)
+{
+ uint32_t elapsed;
+
+ if (lifetime == INFINITE_LIFETIME)
+ return lifetime;
+
+ elapsed = (uint32_t)eloop_timespec_diff(now, acquired, NULL);
+ if (elapsed > lifetime)
+ return 0;
+
+ return lifetime - elapsed;
+}
# endif
#endif
+#define INFINITE_LIFETIME (~0U)
+
const char *hwaddr_ntoa(const void *, size_t, char *, size_t);
size_t hwaddr_aton(uint8_t *, const char *);
ssize_t readfile(const char *, void *, size_t);
int filemtime(const char *, time_t *);
char *get_line(char ** __restrict, ssize_t * __restrict);
int is_root_local(void);
+uint32_t lifetime_left(uint32_t, const struct timespec *, const struct timespec *);
#endif
}
break;
}
+ case RTA_EXPIRES:
+ {
+ rt->rt_expires = *(uint32_t *)RTA_DATA(rta);
+ break;
+ }
}
if (sa != NULL) {
if (!sa_is_loopback(&rt->rt_gateway))
add_attr_32(&nlm.hdr, sizeof(nlm), RTA_OIF, rt->rt_ifp->index);
+ /* add route lifetime */
+ if (rt->rt_expires != 0)
+ add_attr_32(&nlm.hdr, sizeof(nlm), RTA_EXPIRES, rt->rt_expires);
+
if (rt->rt_metric != 0)
add_attr_32(&nlm.hdr, sizeof(nlm), RTA_PRIORITY,
rt->rt_metric);
const struct routeinfo *rinfo;
const struct ipv6_addr *addr;
struct in6_addr netmask;
+ struct timespec now;
if (ctx->ra_routers == NULL)
return 0;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+
TAILQ_FOREACH(rap, ctx->ra_routers, next) {
if (rap->expired)
continue;
#ifdef HAVE_ROUTE_PREF
rt->rt_pref = ipv6nd_rtpref(rinfo->flags);
#endif
+ rt->rt_expires = lifetime_left(rinfo->lifetime, &rinfo->acquired, &now);
rt_proto_add(routes, rt);
}
#ifdef HAVE_ROUTE_PREF
rt->rt_pref = ipv6nd_rtpref(rap->flags);
#endif
+ rt->rt_expires = lifetime_left(addr->prefix_vltime, &addr->acquired, &now);
+
rt_proto_add(routes, rt);
}
}
#ifdef HAVE_ROUTE_PREF
rt->rt_pref = ipv6nd_rtpref(rap->flags);
#endif
+ rt->rt_expires = lifetime_left(rap->lifetime, &rap->acquired, &now);
+
rt_proto_add(routes, rt);
}
return 0;
#define RTDF_GATELINK 0x40 /* Gateway is on link */
size_t rt_order;
rb_node_t rt_tree;
+ uint32_t rt_expires; /* current lifetime of route */
};
extern const rb_tree_ops_t rt_compare_list_ops;