diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index c08b93ebb6..8b99fc0ba8 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -11529,6 +11529,7 @@ queued_ip6_config_change (gpointer user_data) NMDevicePrivate *priv; GSList *iter; gboolean need_ipv6ll = FALSE; + NMPlatform *platform; g_return_val_if_fail (NM_IS_DEVICE (self), G_SOURCE_REMOVE); @@ -11555,11 +11556,24 @@ queued_ip6_config_change (gpointer user_data) } else update_ip_config (self, AF_INET6, FALSE); - if (priv->state < NM_DEVICE_STATE_DEACTIVATING - && nm_platform_link_get (nm_device_get_platform (self), priv->ifindex)) { + if ( priv->state < NM_DEVICE_STATE_DEACTIVATING + && (platform = nm_device_get_platform (self)) + && nm_platform_link_get (platform, priv->ifindex)) { /* Handle DAD failures */ for (iter = priv->dad6_failed_addrs; iter; iter = iter->next) { - const NMPlatformIP6Address *addr = NMP_OBJECT_CAST_IP6_ADDRESS (iter->data); + const NMPObject *obj = iter->data; + const NMPlatformIP6Address *addr = NMP_OBJECT_CAST_IP6_ADDRESS (obj); + const NMPlatformIP6Address *addr2; + + addr2 = NMP_OBJECT_CAST_IP6_ADDRESS (nm_platform_lookup_obj (platform, + NMP_CACHE_ID_TYPE_OBJECT_TYPE, + obj)); + if ( addr2 + && ( NM_FLAGS_HAS (addr2->n_ifa_flags, IFA_F_SECONDARY) + || !NM_FLAGS_HAS (addr2->n_ifa_flags, IFA_F_DADFAILED))) { + /* the address still/again exists and is not in DADFAILED state. Skip it. */ + continue; + } _LOGI (LOGD_IP6, "ipv6: duplicate address check failed for the %s address", nm_platform_ip6_address_to_string (addr, NULL, 0)); diff --git a/src/platform/nmp-object.h b/src/platform/nmp-object.h index 8414c1a57f..8c36e2e3d4 100644 --- a/src/platform/nmp-object.h +++ b/src/platform/nmp-object.h @@ -730,6 +730,16 @@ const NMDedupMultiEntry *nm_platform_lookup_entry (NMPlatform *platform, NMPCacheIdType cache_id_type, const NMPObject *obj); +static inline const NMPObject * +nm_platform_lookup_obj (NMPlatform *platform, + NMPCacheIdType cache_id_type, + const NMPObject *obj) +{ + return nm_dedup_multi_entry_get_obj (nm_platform_lookup_entry (platform, + cache_id_type, + obj)); +} + static inline const NMDedupMultiHeadEntry * nm_platform_lookup_obj_type (NMPlatform *platform, NMPObjectType obj_type)