mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-05 12:18:13 +02:00
ndisc: always emit changed signal if an ndisc parameter changes
Note how the nm_ndisc_add_*() return a boolean to indicate whether anything changes. That is taken to decide whether to emit a changed signal. Previously, we would not consider all fields which are exposed as public API. Note that nm-ip6-config.c would care about the lifetime of NMNDiscAddress. For that, nm_ndisc_add_address() would correctly consider a change of the lifetime as relevant. So, this was for the most part not broken. However, for example nm_ndisc_add_route() would ignore changes to the gateway. Always signal changes if anything changes at all. It's more correct and robust. (cherry picked from commit98ec56c670) (cherry picked from commit2e12660dd4) (cherry picked from commit9f6a654999)
This commit is contained in:
parent
3a2e6c5172
commit
fc9ad78f3a
1 changed files with 37 additions and 23 deletions
|
|
@ -158,6 +158,13 @@ get_expiry_time (guint32 timestamp, guint32 lifetime)
|
|||
: (_item->lifetime) / 2); \
|
||||
})
|
||||
|
||||
#define get_expiry_preferred(item) \
|
||||
({ \
|
||||
typeof (item) _item = (item); \
|
||||
nm_assert (_item); \
|
||||
get_expiry_time ((_item->timestamp), (_item->preferred)); \
|
||||
})
|
||||
|
||||
static const char *
|
||||
_get_exp (char *buf, gsize buf_size, gint64 now_ns, gint32 expiry_time)
|
||||
{
|
||||
|
|
@ -317,9 +324,12 @@ nm_ndisc_add_gateway (NMNDisc *ndisc, const NMNDiscGateway *new)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (get_expiry (item) == get_expiry (new))
|
||||
return FALSE;
|
||||
|
||||
*item = *new;
|
||||
_ASSERT_data_gateways (rdata);
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Put before less preferable gateways. */
|
||||
|
|
@ -411,17 +421,18 @@ nm_ndisc_add_address (NMNDisc *ndisc, const NMNDiscAddress *new)
|
|||
NMNDiscAddress *item = &g_array_index (rdata->addresses, NMNDiscAddress, i);
|
||||
|
||||
if (IN6_ARE_ADDR_EQUAL (&item->address, &new->address)) {
|
||||
gboolean changed;
|
||||
|
||||
if (new->lifetime == 0) {
|
||||
g_array_remove_index (rdata->addresses, i);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
changed = item->timestamp + item->lifetime != new->timestamp + new->lifetime ||
|
||||
item->timestamp + item->preferred != new->timestamp + new->preferred;
|
||||
if ( item->dad_counter == new->dad_counter
|
||||
&& get_expiry (item) == get_expiry (new)
|
||||
&& get_expiry_preferred (item) == get_expiry_preferred (new))
|
||||
return FALSE;
|
||||
|
||||
*item = *new;
|
||||
return changed;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -472,7 +483,8 @@ nm_ndisc_add_route (NMNDisc *ndisc, const NMNDiscRoute *new)
|
|||
for (i = 0; i < rdata->routes->len; ) {
|
||||
NMNDiscRoute *item = &g_array_index (rdata->routes, NMNDiscRoute, i);
|
||||
|
||||
if (IN6_ARE_ADDR_EQUAL (&item->network, &new->network) && item->plen == new->plen) {
|
||||
if ( IN6_ARE_ADDR_EQUAL (&item->network, &new->network)
|
||||
&& item->plen == new->plen) {
|
||||
if (new->lifetime == 0) {
|
||||
g_array_remove_index (rdata->routes, i);
|
||||
return TRUE;
|
||||
|
|
@ -483,8 +495,12 @@ nm_ndisc_add_route (NMNDisc *ndisc, const NMNDiscRoute *new)
|
|||
continue;
|
||||
}
|
||||
|
||||
memcpy (item, new, sizeof (*new));
|
||||
return FALSE;
|
||||
if ( get_expiry (item) == get_expiry (new)
|
||||
&& IN6_ARE_ADDR_EQUAL (&item->gateway, &new->gateway))
|
||||
return FALSE;
|
||||
|
||||
*item = *new;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Put before less preferable routes. */
|
||||
|
|
@ -523,11 +539,12 @@ nm_ndisc_add_dns_server (NMNDisc *ndisc, const NMNDiscDNSServer *new)
|
|||
g_array_remove_index (rdata->dns_servers, i);
|
||||
return TRUE;
|
||||
}
|
||||
if (item->timestamp != new->timestamp || item->lifetime != new->lifetime) {
|
||||
*item = *new;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
if (get_expiry (item) == get_expiry (new))
|
||||
return FALSE;
|
||||
|
||||
*item = *new;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -552,20 +569,17 @@ nm_ndisc_add_dns_domain (NMNDisc *ndisc, const NMNDiscDNSDomain *new)
|
|||
item = &g_array_index (rdata->dns_domains, NMNDiscDNSDomain, i);
|
||||
|
||||
if (!g_strcmp0 (item->domain, new->domain)) {
|
||||
gboolean changed;
|
||||
|
||||
if (new->lifetime == 0) {
|
||||
g_array_remove_index (rdata->dns_domains, i);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
changed = (item->timestamp != new->timestamp ||
|
||||
item->lifetime != new->lifetime);
|
||||
if (changed) {
|
||||
item->timestamp = new->timestamp;
|
||||
item->lifetime = new->lifetime;
|
||||
}
|
||||
return changed;
|
||||
if (get_expiry (item) == get_expiry (new))
|
||||
return FALSE;
|
||||
|
||||
item->timestamp = new->timestamp;
|
||||
item->lifetime = new->lifetime;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue