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"