mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-09 08:18:03 +02:00
platform: make "now" timestamp an in/out parameter to nmp_utils_lifetime_get()
nmp_utils_lifetime_get() calculates the lifetime of addresses, and it bases the result on a "now" timestamp. If you have two addresses and calculate their expiry, then we want to base it on top of the same "now" timestamp, meaning, we should only call nm_utils_get_monotonic_timestamp_sec() once. This is also a performance optimization. But much more importantly, when we make a comparison at a certain moment, we need that all sides have the same understanding of the current timestamp. But nmp_utils_lifetime_get() does not always require the now timestamp. And the caller doesn't know, whether it will need it (short of knowing how nmp_utils_lifetime_get() is implemented). So, make the now parameter an in/out argument. If we pass in an already valid now timestamp, use that. Otherwise, fetch the current time and also return it.
This commit is contained in:
parent
3bd5d2bca9
commit
deb37401e9
4 changed files with 17 additions and 13 deletions
|
|
@ -996,6 +996,7 @@ nm_ndisc_set_config(NMNDisc *ndisc, const NML3ConfigData *l3cd)
|
||||||
const NMPObject *obj;
|
const NMPObject *obj;
|
||||||
guint len;
|
guint len;
|
||||||
guint i;
|
guint i;
|
||||||
|
gint32 fake_now = NM_NDISC_EXPIRY_BASE_TIMESTAMP / 1000;
|
||||||
|
|
||||||
nm_assert(NM_IS_NDISC(ndisc));
|
nm_assert(NM_IS_NDISC(ndisc));
|
||||||
nm_assert(nm_ndisc_get_node_type(ndisc) == NM_NDISC_NODE_TYPE_ROUTER);
|
nm_assert(nm_ndisc_get_node_type(ndisc) == NM_NDISC_NODE_TYPE_ROUTER);
|
||||||
|
|
@ -1018,7 +1019,7 @@ nm_ndisc_set_config(NMNDisc *ndisc, const NML3ConfigData *l3cd)
|
||||||
lifetime = nmp_utils_lifetime_get(addr->timestamp,
|
lifetime = nmp_utils_lifetime_get(addr->timestamp,
|
||||||
addr->lifetime,
|
addr->lifetime,
|
||||||
addr->preferred,
|
addr->preferred,
|
||||||
NM_NDISC_EXPIRY_BASE_TIMESTAMP / 1000,
|
&fake_now,
|
||||||
&preferred);
|
&preferred);
|
||||||
if (!lifetime)
|
if (!lifetime)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -2132,12 +2132,15 @@ guint32
|
||||||
nmp_utils_lifetime_get(guint32 timestamp,
|
nmp_utils_lifetime_get(guint32 timestamp,
|
||||||
guint32 lifetime,
|
guint32 lifetime,
|
||||||
guint32 preferred,
|
guint32 preferred,
|
||||||
gint32 now,
|
gint32 *cached_now,
|
||||||
guint32 *out_preferred)
|
guint32 *out_preferred)
|
||||||
{
|
{
|
||||||
guint32 t_lifetime, t_preferred;
|
guint32 t_lifetime;
|
||||||
|
guint32 t_preferred;
|
||||||
|
gint32 now;
|
||||||
|
|
||||||
nm_assert(now >= 0);
|
nm_assert(cached_now);
|
||||||
|
nm_assert(*cached_now >= 0);
|
||||||
|
|
||||||
if (timestamp == 0 && lifetime == 0) {
|
if (timestamp == 0 && lifetime == 0) {
|
||||||
/* We treat lifetime==0 && timestamp==0 addresses as permanent addresses to allow easy
|
/* We treat lifetime==0 && timestamp==0 addresses as permanent addresses to allow easy
|
||||||
|
|
@ -2150,8 +2153,7 @@ nmp_utils_lifetime_get(guint32 timestamp,
|
||||||
return NM_PLATFORM_LIFETIME_PERMANENT;
|
return NM_PLATFORM_LIFETIME_PERMANENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (now <= 0)
|
now = nm_utils_get_monotonic_timestamp_sec_cached(cached_now);
|
||||||
now = nm_utils_get_monotonic_timestamp_sec();
|
|
||||||
|
|
||||||
t_lifetime = nmp_utils_lifetime_rebase_relative_time_on_now(timestamp, lifetime, now);
|
t_lifetime = nmp_utils_lifetime_rebase_relative_time_on_now(timestamp, lifetime, now);
|
||||||
if (!t_lifetime) {
|
if (!t_lifetime) {
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ nmp_utils_lifetime_rebase_relative_time_on_now(guint32 timestamp, guint32 durati
|
||||||
guint32 nmp_utils_lifetime_get(guint32 timestamp,
|
guint32 nmp_utils_lifetime_get(guint32 timestamp,
|
||||||
guint32 lifetime,
|
guint32 lifetime,
|
||||||
guint32 preferred,
|
guint32 preferred,
|
||||||
gint32 now,
|
gint32 *cached_now,
|
||||||
guint32 *out_preferred);
|
guint32 *out_preferred);
|
||||||
|
|
||||||
int nmp_utils_modprobe(GError **error, gboolean suppress_error_logging, const char *arg1, ...)
|
int nmp_utils_modprobe(GError **error, gboolean suppress_error_logging, const char *arg1, ...)
|
||||||
|
|
|
||||||
|
|
@ -3696,7 +3696,7 @@ static gboolean
|
||||||
_addr_array_clean_expired(int addr_family,
|
_addr_array_clean_expired(int addr_family,
|
||||||
int ifindex,
|
int ifindex,
|
||||||
GPtrArray *array,
|
GPtrArray *array,
|
||||||
guint32 now,
|
gint32 *cached_now,
|
||||||
GHashTable **idx)
|
GHashTable **idx)
|
||||||
{
|
{
|
||||||
guint i;
|
guint i;
|
||||||
|
|
@ -3704,7 +3704,8 @@ _addr_array_clean_expired(int addr_family,
|
||||||
|
|
||||||
nm_assert_addr_family(addr_family);
|
nm_assert_addr_family(addr_family);
|
||||||
nm_assert(ifindex > 0);
|
nm_assert(ifindex > 0);
|
||||||
nm_assert(now > 0);
|
nm_assert(cached_now);
|
||||||
|
nm_assert(*cached_now >= 0);
|
||||||
|
|
||||||
if (!array)
|
if (!array)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
@ -3738,7 +3739,7 @@ _addr_array_clean_expired(int addr_family,
|
||||||
goto clear_and_next;
|
goto clear_and_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nmp_utils_lifetime_get(a->timestamp, a->lifetime, a->preferred, now, NULL))
|
if (!nmp_utils_lifetime_get(a->timestamp, a->lifetime, a->preferred, cached_now, NULL))
|
||||||
goto clear_and_next;
|
goto clear_and_next;
|
||||||
|
|
||||||
if (G_UNLIKELY(!*idx)) {
|
if (G_UNLIKELY(!*idx)) {
|
||||||
|
|
@ -3981,7 +3982,7 @@ nm_platform_ip_address_sync(NMPlatform *self,
|
||||||
GPtrArray *known_addresses,
|
GPtrArray *known_addresses,
|
||||||
GPtrArray *addresses_prune)
|
GPtrArray *addresses_prune)
|
||||||
{
|
{
|
||||||
const gint32 now = nm_utils_get_monotonic_timestamp_sec();
|
gint32 now = 0;
|
||||||
const int IS_IPv4 = NM_IS_IPv4(addr_family);
|
const int IS_IPv4 = NM_IS_IPv4(addr_family);
|
||||||
NMPLookup lookup;
|
NMPLookup lookup;
|
||||||
const gboolean EXTRA_LOGGING = FALSE;
|
const gboolean EXTRA_LOGGING = FALSE;
|
||||||
|
|
@ -4043,7 +4044,7 @@ nm_platform_ip_address_sync(NMPlatform *self,
|
||||||
if (!_addr_array_clean_expired(addr_family,
|
if (!_addr_array_clean_expired(addr_family,
|
||||||
ifindex,
|
ifindex,
|
||||||
known_addresses,
|
known_addresses,
|
||||||
now,
|
&now,
|
||||||
&known_addresses_idx))
|
&known_addresses_idx))
|
||||||
known_addresses = NULL;
|
known_addresses = NULL;
|
||||||
|
|
||||||
|
|
@ -4328,7 +4329,7 @@ next_plat:;
|
||||||
lifetime = nmp_utils_lifetime_get(known_address->ax.timestamp,
|
lifetime = nmp_utils_lifetime_get(known_address->ax.timestamp,
|
||||||
known_address->ax.lifetime,
|
known_address->ax.lifetime,
|
||||||
known_address->ax.preferred,
|
known_address->ax.preferred,
|
||||||
now,
|
&now,
|
||||||
&preferred);
|
&preferred);
|
||||||
nm_assert(lifetime > 0);
|
nm_assert(lifetime > 0);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue