From 4b3ad7709dccb3d5094dc6c8cb0d1505a992bc62 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Wed, 3 Dec 2014 14:26:23 +0100 Subject: [PATCH] device: don't fail activation when IP config is unavailable and unneeded If we didn't start IPv4 and IPv6, but they're allowed to fail, progress the activation without failing it. Also, progress assumed connections to check-ip with whatever configuration that is available. https://bugzilla.redhat.com/show_bug.cgi?id=1141264 --- src/devices/nm-device.c | 55 ++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index c260fc81bf..f834875cbf 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -4536,6 +4536,42 @@ nm_device_activate_stage3_ip6_start (NMDevice *self) return TRUE; } +/* + * nm_device_check_ip_failed + * + * Progress the device to appropriate state if both IPv4 and IPv6 failed + */ +static void +nm_device_check_ip_failed (NMDevice *self, gboolean may_fail) +{ + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + NMDeviceState state; + + if ( priv->ip4_state != IP_FAIL + || priv->ip6_state != IP_FAIL) + return; + + if (nm_device_uses_assumed_connection (self)) { + /* We have assumed configuration, but couldn't + * redo it. No problem, move to check state. */ + priv->ip4_state = priv->ip6_state = IP_DONE; + state = NM_DEVICE_STATE_IP_CHECK; + } else if ( may_fail + && get_ip_config_may_fail (self, AF_INET) + && get_ip_config_may_fail (self, AF_INET6)) { + /* Couldn't start either IPv6 and IPv4 autoconfiguration, + * but both are allowed to fail. */ + state = NM_DEVICE_STATE_SECONDARIES; + } else { + /* Autoconfiguration attempted without success. */ + state = NM_DEVICE_STATE_FAILED; + } + + nm_device_state_changed (self, + state, + NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE); +} + /* * nm_device_activate_stage3_ip_config_start * @@ -4590,10 +4626,7 @@ nm_device_activate_stage3_ip_config_start (gpointer user_data) if (!nm_device_activate_stage3_ip6_start (self)) goto out; - if (priv->ip4_state == IP_FAIL && priv->ip6_state == IP_FAIL) { - nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, - NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE); - } + nm_device_check_ip_failed (self, TRUE); out: _LOGI (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) complete."); @@ -4708,11 +4741,7 @@ nm_device_activate_ip4_config_timeout (gpointer user_data) priv->ip4_state = IP_FAIL; - /* If IPv4 failed and IPv6 failed, the activation fails */ - if (priv->ip6_state == IP_FAIL) - nm_device_state_changed (self, - NM_DEVICE_STATE_FAILED, - NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE); + nm_device_check_ip_failed (self, FALSE); out: _LOGI (LOGD_DEVICE | LOGD_IP4, @@ -4787,11 +4816,7 @@ nm_device_activate_ip6_config_timeout (gpointer user_data) priv->ip6_state = IP_FAIL; - /* If IPv6 failed and IPv4 failed, the activation fails */ - if (priv->ip4_state == IP_FAIL) - nm_device_state_changed (self, - NM_DEVICE_STATE_FAILED, - NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE); + nm_device_check_ip_failed (self, FALSE); out: _LOGI (LOGD_DEVICE | LOGD_IP6, @@ -6065,7 +6090,7 @@ nm_device_start_ip_check (NMDevice *self) timeout = nm_setting_connection_get_gateway_ping_timeout (s_con); if (timeout) { - if (priv->ip4_state == IP_DONE) { + if (priv->ip4_config && priv->ip4_state == IP_DONE) { guint gw = 0; ping_binary = "/usr/bin/ping";