diff --git a/NEWS b/NEWS
index fa15b2840e..f9f1832be4 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE!
same link. If the link has no DNS servers, the connectivity check will
use any servers available in the system.
* Install the systemd units in the initramfs using a systemd generator.
+* A new "check-connectivity" configuration option is available to disable the
+ connectivity check for selected interfaces.
=============================================
NetworkManager-1.56
diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index 4be17d20cd..2832982f3f 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -1329,6 +1329,20 @@ managed=1
+
+ check-connectivity
+
+
+ A boolean value specifying whether NetworkManager will perform a connectivity check
+ for this device. Defaults to yes.
+
+
+ This setting does nothing if the connectivity check has been
+ disabled globally using the
+ connectivity.enabled setting.
+
+
+
keep-configuration
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index 04850fbecf..91ddbc9489 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -6331,6 +6331,14 @@ concheck_is_possible(NMDevice *self)
if (priv->state == NM_DEVICE_STATE_UNKNOWN)
return FALSE;
+ if (!nm_config_data_get_device_config_boolean_by_device(
+ NM_CONFIG_GET_DATA,
+ NM_CONFIG_KEYFILE_KEY_DEVICE_CHECK_CONNECTIVITY,
+ self,
+ TRUE,
+ TRUE))
+ return FALSE;
+
return TRUE;
}
@@ -6351,8 +6359,10 @@ concheck_periodic_schedule_do(NMDevice *self, int addr_family, gint64 now_ns)
goto out;
}
- if (!concheck_is_possible(self))
+ if (!concheck_is_possible(self)) {
+ concheck_update_state(self, addr_family, NM_CONNECTIVITY_UNKNOWN, FALSE);
goto out;
+ }
nm_assert(now_ns > 0);
nm_assert(priv->concheck_x[IS_IPv4].p_cur_interval > 0);
@@ -6575,7 +6585,11 @@ concheck_update_interval(NMDevice *self, int addr_family, gboolean check_now)
concheck_periodic_schedule_do(self, addr_family, 0);
/* also update the fake connectivity state. */
- concheck_update_state(self, addr_family, NM_CONNECTIVITY_FAKE, TRUE);
+ if (concheck_is_possible(self))
+ concheck_update_state(self, addr_family, NM_CONNECTIVITY_FAKE, TRUE);
+ else
+ concheck_update_state(self, addr_family, NM_CONNECTIVITY_UNKNOWN, FALSE);
+
return;
}
@@ -6604,6 +6618,7 @@ concheck_update_state(NMDevice *self,
/* @state is a result of the connectivity check. We only expect a precise
* number of possible values. */
nm_assert(NM_IN_SET(state,
+ NM_CONNECTIVITY_UNKNOWN,
NM_CONNECTIVITY_LIMITED,
NM_CONNECTIVITY_PORTAL,
NM_CONNECTIVITY_FULL,
@@ -6927,8 +6942,11 @@ nm_device_check_connectivity(NMDevice *self,
NMDeviceConnectivityCallback callback,
gpointer user_data)
{
- if (!concheck_is_possible(self))
+ if (!concheck_is_possible(self)) {
+ concheck_update_state(self, AF_INET, NM_CONNECTIVITY_UNKNOWN, FALSE);
+ concheck_update_state(self, AF_INET6, NM_CONNECTIVITY_UNKNOWN, FALSE);
return NULL;
+ }
concheck_periodic_schedule_set(self, addr_family, CONCHECK_SCHEDULE_CHECK_EXTERNAL);
return concheck_start(self, addr_family, callback, user_data, FALSE);
@@ -8316,6 +8334,17 @@ config_changed(NMConfig *config,
&& !nm_device_get_applied_setting(self, NM_TYPE_SETTING_SRIOV))
device_init_static_sriov_num_vfs(self);
}
+
+ if (NM_FLAGS_HAS(changes, NM_CONFIG_CHANGE_VALUES) && concheck_is_possible(self)) {
+ /* restart (periodic) connectivity checks if they were previously disabled */
+ if (!nm_config_data_get_device_config_boolean_by_device(
+ old_data,
+ NM_CONFIG_KEYFILE_KEY_DEVICE_CHECK_CONNECTIVITY,
+ self,
+ TRUE,
+ TRUE))
+ nm_device_check_connectivity_update_interval(self);
+ }
}
static void
diff --git a/src/core/nm-config.c b/src/core/nm-config.c
index d1f2bbed35..472d783053 100644
--- a/src/core/nm-config.c
+++ b/src/core/nm-config.c
@@ -892,6 +892,7 @@ static const ConfigGroup config_groups[] = {
.is_prefix = TRUE,
.keys = NM_MAKE_STRV(NM_CONFIG_KEYFILE_KEY_DEVICE_CARRIER_WAIT_TIMEOUT,
NM_CONFIG_KEYFILE_KEY_DEVICE_IGNORE_CARRIER,
+ NM_CONFIG_KEYFILE_KEY_DEVICE_CHECK_CONNECTIVITY,
NM_CONFIG_KEYFILE_KEY_DEVICE_MANAGED,
NM_CONFIG_KEYFILE_KEY_DEVICE_SRIOV_NUM_VFS,
NM_CONFIG_KEYFILE_KEY_DEVICE_KEEP_CONFIGURATION,
diff --git a/src/libnm-base/nm-config-base.h b/src/libnm-base/nm-config-base.h
index d101c95c84..e8d46ddc09 100644
--- a/src/libnm-base/nm-config-base.h
+++ b/src/libnm-base/nm-config-base.h
@@ -65,6 +65,7 @@
#define NM_CONFIG_KEYFILE_KEY_DEVICE_MANAGED "managed"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_IGNORE_CARRIER "ignore-carrier"
+#define NM_CONFIG_KEYFILE_KEY_DEVICE_CHECK_CONNECTIVITY "check-connectivity"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_SRIOV_NUM_VFS "sriov-num-vfs"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_KEEP_CONFIGURATION "keep-configuration"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_ALLOWED_CONNECTIONS "allowed-connections"