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:
Thomas Haller 2022-03-29 22:45:56 +02:00
parent 3bd5d2bca9
commit deb37401e9
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
4 changed files with 17 additions and 13 deletions

View file

@ -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;

View file

@ -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) {

View file

@ -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, ...)

View file

@ -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);