diff options
author | Thomas Haller <thaller@redhat.com> | 2018-02-07 22:22:38 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2018-02-09 17:40:01 +0100 |
commit | d5a51a1ad2209c47459b6dd3207d343c28ec65ed (patch) | |
tree | 8525f30aed2481a5abdeda37665248f5adf39411 | |
parent | 7f223cb82720cb04f7cd0de9d3759d0b76d4aa53 (diff) | |
download | NetworkManager-d5a51a1ad2209c47459b6dd3207d343c28ec65ed.tar.gz |
platform: modifiy @known_addresses list in nm_platform_ip6_address_sync()
Often, we want in API that an input argument is read-only and not modified
by the function call. Not modifying input arguments is a good
convention.
However, in this case there are only two callers, and both clearly do
not care whether the @known_addresses array will be modified.
Clear out addresses that are already expired and enforce that there are
no duplicate addresses. Basically, use @known_addresses for bookkeeping
which addresses are to be ignored.
-rw-r--r-- | src/platform/nm-platform.c | 23 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 4 |
2 files changed, 20 insertions, 7 deletions
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 8a53f7c6a4..02986569b9 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -3193,6 +3193,9 @@ array_ip6_address_position (const GPtrArray *addresses, for (i = 0, pos = 0; i < len; i++) { NMPlatformIP6Address *candidate = NMP_OBJECT_CAST_IP6_ADDRESS (addresses->pdata[i]); + if (!candidate) + continue; + if ( IN6_ARE_ADDR_EQUAL (&candidate->address, &address->address) && candidate->plen == address->plen && nm_utils_lifetime_get (candidate->timestamp, @@ -3512,8 +3515,14 @@ delete_and_next2: * nm_platform_ip6_address_sync: * @self: platform instance * @ifindex: Interface index - * @known_addresses: List of IPv6 addresses, as NMPObject. The list - * is not modified. + * @known_addresses: List of addresses. The list will be modified and only + * addresses that were successfully added will be kept in the list. + * That means, expired addresses and addresses that could not be added + * will be dropped. + * Hence, the input argument @known_addresses is also an output argument + * telling which addresses were succesfully added. + * Addresses are removed by unrefing the instance via nmp_object_unref() + * and leaving a NULL tombstone. * @keep_link_local: Don't remove link-local address * * A convenience function to synchronize addresses for a specific interface @@ -3525,7 +3534,7 @@ delete_and_next2: gboolean nm_platform_ip6_address_sync (NMPlatform *self, int ifindex, - const GPtrArray *known_addresses, + GPtrArray *known_addresses, gboolean keep_link_local) { gs_unref_ptrarray GPtrArray *plat_addresses = NULL; @@ -3536,6 +3545,9 @@ nm_platform_ip6_address_sync (NMPlatform *self, guint32 ifa_flags; gboolean remove = FALSE; + if (!_addr_array_clean_expired (AF_INET6, ifindex, known_addresses, now, NULL)) + known_addresses = NULL; + /* @plat_addresses and @known_addresses are in increasing priority order */ plat_addresses = nm_platform_lookup_clone (self, nmp_lookup_init_object (&lookup, @@ -3596,6 +3608,9 @@ nm_platform_ip6_address_sync (NMPlatform *self, const NMPlatformIP6Address *known_address = NMP_OBJECT_CAST_IP6_ADDRESS (known_addresses->pdata[i]); guint32 lifetime, preferred; + if (!known_address) + continue; + if (NM_FLAGS_HAS (known_address->n_ifa_flags, IFA_F_SECONDARY)) { /* Kernel manages these */ continue; @@ -3603,8 +3618,6 @@ nm_platform_ip6_address_sync (NMPlatform *self, lifetime = nm_utils_lifetime_get (known_address->timestamp, known_address->lifetime, known_address->preferred, now, &preferred); - if (!lifetime) - continue; if (!nm_platform_ip6_address_add (self, ifindex, known_address->address, known_address->plen, known_address->peer_address, diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 0f2475126a..9ae07a0046 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -1260,8 +1260,8 @@ gboolean nm_platform_ip6_address_add (NMPlatform *self, guint32 flags); gboolean nm_platform_ip4_address_delete (NMPlatform *self, int ifindex, in_addr_t address, guint8 plen, in_addr_t peer_address); gboolean nm_platform_ip6_address_delete (NMPlatform *self, int ifindex, struct in6_addr address, guint8 plen); -gboolean nm_platform_ip4_address_sync (NMPlatform *self, int ifindex, GPtrArray *known_addresse); -gboolean nm_platform_ip6_address_sync (NMPlatform *self, int ifindex, const GPtrArray *known_addresses, gboolean keep_link_local); +gboolean nm_platform_ip4_address_sync (NMPlatform *self, int ifindex, GPtrArray *known_addresses); +gboolean nm_platform_ip6_address_sync (NMPlatform *self, int ifindex, GPtrArray *known_addresses, gboolean keep_link_local); gboolean nm_platform_ip_address_flush (NMPlatform *self, int addr_family, int ifindex); |