connectivity: add per-device check-connectivity setting

Adds a new `check-connectivity` setting to the `device` section which can be
used to disable the connectivity check for a particular device.
This commit is contained in:
Popax21 2025-11-20 16:26:38 +01:00
parent 8a9b17071b
commit a9f2c15663
5 changed files with 50 additions and 3 deletions

2
NEWS
View file

@ -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 same link. If the link has no DNS servers, the connectivity check will
use any servers available in the system. use any servers available in the system.
* Install the systemd units in the initramfs using a systemd generator. * 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 NetworkManager-1.56

View file

@ -1329,6 +1329,20 @@ managed=1
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry id="check-connectivity">
<term><varname>check-connectivity</varname></term>
<listitem>
<para>
A boolean value specifying whether NetworkManager will perform a connectivity check
for this device. Defaults to <literal>yes</literal>.
</para>
<para>
This setting does nothing if the connectivity check has been
disabled globally using the
<literal>connectivity.enabled</literal> setting.
</para>
</listitem>
</varlistentry>
<varlistentry id="keep-configuration"> <varlistentry id="keep-configuration">
<term><varname>keep-configuration</varname></term> <term><varname>keep-configuration</varname></term>
<listitem> <listitem>

View file

@ -6331,6 +6331,14 @@ concheck_is_possible(NMDevice *self)
if (priv->state == NM_DEVICE_STATE_UNKNOWN) if (priv->state == NM_DEVICE_STATE_UNKNOWN)
return FALSE; 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; return TRUE;
} }
@ -6351,8 +6359,10 @@ concheck_periodic_schedule_do(NMDevice *self, int addr_family, gint64 now_ns)
goto out; goto out;
} }
if (!concheck_is_possible(self)) if (!concheck_is_possible(self)) {
concheck_update_state(self, addr_family, NM_CONNECTIVITY_UNKNOWN, FALSE);
goto out; goto out;
}
nm_assert(now_ns > 0); nm_assert(now_ns > 0);
nm_assert(priv->concheck_x[IS_IPv4].p_cur_interval > 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); concheck_periodic_schedule_do(self, addr_family, 0);
/* also update the fake connectivity state. */ /* 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; return;
} }
@ -6604,6 +6618,7 @@ concheck_update_state(NMDevice *self,
/* @state is a result of the connectivity check. We only expect a precise /* @state is a result of the connectivity check. We only expect a precise
* number of possible values. */ * number of possible values. */
nm_assert(NM_IN_SET(state, nm_assert(NM_IN_SET(state,
NM_CONNECTIVITY_UNKNOWN,
NM_CONNECTIVITY_LIMITED, NM_CONNECTIVITY_LIMITED,
NM_CONNECTIVITY_PORTAL, NM_CONNECTIVITY_PORTAL,
NM_CONNECTIVITY_FULL, NM_CONNECTIVITY_FULL,
@ -6927,8 +6942,11 @@ nm_device_check_connectivity(NMDevice *self,
NMDeviceConnectivityCallback callback, NMDeviceConnectivityCallback callback,
gpointer user_data) 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; return NULL;
}
concheck_periodic_schedule_set(self, addr_family, CONCHECK_SCHEDULE_CHECK_EXTERNAL); concheck_periodic_schedule_set(self, addr_family, CONCHECK_SCHEDULE_CHECK_EXTERNAL);
return concheck_start(self, addr_family, callback, user_data, FALSE); 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)) && !nm_device_get_applied_setting(self, NM_TYPE_SETTING_SRIOV))
device_init_static_sriov_num_vfs(self); 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 static void

View file

@ -892,6 +892,7 @@ static const ConfigGroup config_groups[] = {
.is_prefix = TRUE, .is_prefix = TRUE,
.keys = NM_MAKE_STRV(NM_CONFIG_KEYFILE_KEY_DEVICE_CARRIER_WAIT_TIMEOUT, .keys = NM_MAKE_STRV(NM_CONFIG_KEYFILE_KEY_DEVICE_CARRIER_WAIT_TIMEOUT,
NM_CONFIG_KEYFILE_KEY_DEVICE_IGNORE_CARRIER, 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_MANAGED,
NM_CONFIG_KEYFILE_KEY_DEVICE_SRIOV_NUM_VFS, NM_CONFIG_KEYFILE_KEY_DEVICE_SRIOV_NUM_VFS,
NM_CONFIG_KEYFILE_KEY_DEVICE_KEEP_CONFIGURATION, NM_CONFIG_KEYFILE_KEY_DEVICE_KEEP_CONFIGURATION,

View file

@ -65,6 +65,7 @@
#define NM_CONFIG_KEYFILE_KEY_DEVICE_MANAGED "managed" #define NM_CONFIG_KEYFILE_KEY_DEVICE_MANAGED "managed"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_IGNORE_CARRIER "ignore-carrier" #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_SRIOV_NUM_VFS "sriov-num-vfs"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_KEEP_CONFIGURATION "keep-configuration" #define NM_CONFIG_KEYFILE_KEY_DEVICE_KEEP_CONFIGURATION "keep-configuration"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_ALLOWED_CONNECTIONS "allowed-connections" #define NM_CONFIG_KEYFILE_KEY_DEVICE_ALLOWED_CONNECTIONS "allowed-connections"