diff options
author | Jiří Klimeš <jklimes@redhat.com> | 2015-06-24 08:59:36 +0000 |
---|---|---|
committer | Jiří Klimeš <jklimes@redhat.com> | 2015-06-24 12:21:48 +0200 |
commit | 442fa1b819ccca424a07c1646071500c819f239e (patch) | |
tree | 419a5014d1d97ec9a6d2b0161bd46f6790922b45 | |
parent | d0b36af78ab7d2afa4e93656c9314eab3c16ffda (diff) | |
download | NetworkManager-jk/ip-config-change-fix.tar.gz |
device: split IP config changes signal handling to IPv4 and IPv6jk/ip-config-change-fix
So that we don't process IPv4 changes for IPv6 and vice versa.
-rw-r--r-- | src/devices/nm-device.c | 113 |
1 files changed, 87 insertions, 26 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 8c8ebc40ee..2e87631af7 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -185,7 +185,8 @@ typedef struct { NMDeviceState state; NMDeviceStateReason state_reason; QueuedState queued_state; - guint queued_ip_config_id; + guint queued_ip4_config_id; + guint queued_ip6_config_id; GSList *pending_actions; char * udi; @@ -5663,10 +5664,15 @@ nm_device_queued_ip_config_change_clear (NMDevice *self) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - if (priv->queued_ip_config_id) { - _LOGD (LOGD_DEVICE, "clearing queued IP config change"); - g_source_remove (priv->queued_ip_config_id); - priv->queued_ip_config_id = 0; + if (priv->queued_ip4_config_id) { + _LOGD (LOGD_DEVICE, "clearing queued IP4 config change"); + g_source_remove (priv->queued_ip4_config_id); + priv->queued_ip4_config_id = 0; + } + if (priv->queued_ip6_config_id) { + _LOGD (LOGD_DEVICE, "clearing queued IP6 config change"); + g_source_remove (priv->queued_ip6_config_id); + priv->queued_ip6_config_id = 0; } } @@ -7059,11 +7065,10 @@ capture_lease_config (NMDevice *self, } static void -update_ip_config (NMDevice *self, gboolean initial) +update_ip4_config (NMDevice *self, gboolean initial) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); int ifindex; - gboolean linklocal6_just_completed = FALSE; gboolean capture_resolv_conf; NMDnsManagerResolvConfMode resolv_conf_mode; @@ -7110,6 +7115,23 @@ update_ip_config (NMDevice *self, gboolean initial) ip4_config_merge_and_apply (self, NULL, FALSE, NULL); } +} + +static void +update_ip6_config (NMDevice *self, gboolean initial) +{ + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + int ifindex; + gboolean linklocal6_just_completed = FALSE; + gboolean capture_resolv_conf; + NMDnsManagerResolvConfMode resolv_conf_mode; + + ifindex = nm_device_get_ip_ifindex (self); + if (!ifindex) + return; + + resolv_conf_mode = nm_dns_manager_get_resolv_conf_mode (nm_dns_manager_get ()); + capture_resolv_conf = initial && (resolv_conf_mode == NM_DNS_MANAGER_RESOLV_CONF_EXPLICIT); /* IPv6 */ g_clear_object (&priv->ext_ip6_config); @@ -7163,11 +7185,30 @@ update_ip_config (NMDevice *self, gboolean initial) void nm_device_capture_initial_config (NMDevice *self) { - update_ip_config (self, TRUE); + update_ip4_config (self, TRUE); + update_ip6_config (self, TRUE); +} + +static gboolean +queued_ip4_config_change (gpointer user_data) +{ + NMDevice *self = NM_DEVICE (user_data); + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + + /* Wait for any queued state changes */ + if (priv->queued_state.id) + return TRUE; + + priv->queued_ip4_config_id = 0; + g_object_ref (self); + update_ip4_config (self, FALSE); + g_object_unref (self); + + return FALSE; } static gboolean -queued_ip_config_change (gpointer user_data) +queued_ip6_config_change (gpointer user_data) { NMDevice *self = NM_DEVICE (user_data); NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); @@ -7176,9 +7217,9 @@ queued_ip_config_change (gpointer user_data) if (priv->queued_state.id) return TRUE; - priv->queued_ip_config_id = 0; + priv->queued_ip6_config_id = 0; g_object_ref (self); - update_ip_config (self, FALSE); + update_ip6_config (self, FALSE); /* If no IPv6 link-local address exists but other addresses do then we * must add the LL address to remain conformant with RFC 3513 chapter 2.1 @@ -7194,19 +7235,37 @@ queued_ip_config_change (gpointer user_data) } static void -device_ip_changed (NMPlatform *platform, - int ifindex, - gpointer platform_object, - NMPlatformSignalChangeType change_type, - NMPlatformReason reason, - NMDevice *self) +device_ip4_changed (NMPlatform *platform, + int ifindex, + gpointer platform_object, + NMPlatformSignalChangeType change_type, + NMPlatformReason reason, + NMDevice *self) +{ + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + + if (nm_device_get_ip_ifindex (self) == ifindex) { + if (!priv->queued_ip4_config_id) { + priv->queued_ip4_config_id = g_idle_add (queued_ip4_config_change, self); + _LOGD (LOGD_DEVICE, "queued IP4 config change"); + } + } +} + +static void +device_ip6_changed (NMPlatform *platform, + int ifindex, + gpointer platform_object, + NMPlatformSignalChangeType change_type, + NMPlatformReason reason, + NMDevice *self) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); if (nm_device_get_ip_ifindex (self) == ifindex) { - if (!priv->queued_ip_config_id) { - priv->queued_ip_config_id = g_idle_add (queued_ip_config_change, self); - _LOGD (LOGD_DEVICE, "queued IP config change"); + if (!priv->queued_ip6_config_id) { + priv->queued_ip6_config_id = g_idle_add (queued_ip6_config_change, self); + _LOGD (LOGD_DEVICE, "queued IP6 config change"); } } } @@ -8778,14 +8837,15 @@ constructor (GType type, /* Watch for external IP config changes */ platform = nm_platform_get (); - g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (device_ip_changed), self); - g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (device_ip_changed), self); - g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (device_ip_changed), self); - g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (device_ip_changed), self); + g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (device_ip4_changed), self); + g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (device_ip6_changed), self); + g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (device_ip4_changed), self); + g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (device_ip6_changed), self); g_signal_connect (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, G_CALLBACK (link_changed_cb), self); /* trigger initial ip config change to initialize ip-config */ - priv->queued_ip_config_id = g_idle_add (queued_ip_config_change, self); + priv->queued_ip4_config_id = g_idle_add (queued_ip4_config_change, self); + priv->queued_ip6_config_id = g_idle_add (queued_ip6_config_change, self); if (nm_platform_check_support_user_ipv6ll (NM_PLATFORM_GET)) { int ip_ifindex = nm_device_get_ip_ifindex (self); @@ -8939,7 +8999,8 @@ dispose (GObject *object) _clear_queued_act_request (priv); platform = nm_platform_get (); - g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip_changed), self); + g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip4_changed), self); + g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip6_changed), self); g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (link_changed_cb), self); nm_clear_g_source (&priv->device_link_changed_id); |