core/platform: fix wrong calculation of address lifetime/preferred for kernel addresses
When receiving an IPv4/IPv6 address from the kernel, platform set the timestamp to an invalid value before. The address timestamp must be set to *now*, because the lifetime and preferred arguments are counting from now. Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
@@ -760,6 +760,16 @@ hack_empty_master_iff_lower_up (NMPlatform *platform, struct nl_object *object)
|
|||||||
rtnl_link_unset_flags (rtnllink, IFF_LOWER_UP);
|
rtnl_link_unset_flags (rtnllink, IFF_LOWER_UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
get_time (void)
|
||||||
|
{
|
||||||
|
struct timespec tp;
|
||||||
|
|
||||||
|
clock_gettime (CLOCK_MONOTONIC, &tp);
|
||||||
|
|
||||||
|
return tp.tv_sec;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr)
|
init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr)
|
||||||
{
|
{
|
||||||
@@ -772,7 +782,7 @@ init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr)
|
|||||||
|
|
||||||
address->ifindex = rtnl_addr_get_ifindex (rtnladdr);
|
address->ifindex = rtnl_addr_get_ifindex (rtnladdr);
|
||||||
address->plen = rtnl_addr_get_prefixlen (rtnladdr);
|
address->plen = rtnl_addr_get_prefixlen (rtnladdr);
|
||||||
address->timestamp = rtnl_addr_get_create_time (rtnladdr);
|
address->timestamp = get_time ();
|
||||||
address->lifetime = rtnl_addr_get_valid_lifetime (rtnladdr);
|
address->lifetime = rtnl_addr_get_valid_lifetime (rtnladdr);
|
||||||
address->preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
|
address->preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
|
||||||
g_assert (nl_addr_get_len (nladdr) == sizeof (address->address));
|
g_assert (nl_addr_get_len (nladdr) == sizeof (address->address));
|
||||||
@@ -793,7 +803,7 @@ init_ip6_address (NMPlatformIP6Address *address, struct rtnl_addr *rtnladdr)
|
|||||||
|
|
||||||
address->ifindex = rtnl_addr_get_ifindex (rtnladdr);
|
address->ifindex = rtnl_addr_get_ifindex (rtnladdr);
|
||||||
address->plen = rtnl_addr_get_prefixlen (rtnladdr);
|
address->plen = rtnl_addr_get_prefixlen (rtnladdr);
|
||||||
address->timestamp = rtnl_addr_get_create_time (rtnladdr);
|
address->timestamp = get_time ();
|
||||||
address->lifetime = rtnl_addr_get_valid_lifetime (rtnladdr);
|
address->lifetime = rtnl_addr_get_valid_lifetime (rtnladdr);
|
||||||
address->preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
|
address->preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
|
||||||
address->flags = rtnl_addr_get_flags (rtnladdr);
|
address->flags = rtnl_addr_get_flags (rtnladdr);
|
||||||
|
Reference in New Issue
Block a user