core: add comments about assuming connections

(cherry picked from commit bb37e30867)
This commit is contained in:
Beniamino Galvani 2021-05-07 10:13:26 +02:00
parent 9b704bf4bf
commit bd114483b2
2 changed files with 27 additions and 19 deletions

View file

@ -7239,6 +7239,16 @@ _get_maybe_ipv6_disabled(NMDevice *self)
return (nm_platform_sysctl_get_int32(platform, NMP_SYSCTL_PATHID_ABSOLUTE(path), 0) == 0);
}
/*
* nm_device_generate_connection:
*
* Generates a connection from an existing interface.
*
* If the device doesn't have an IP configuration and it's not a port or a
* controller, then no connection gets generated and the function returns
* %NULL. In such case, @maybe_later is set to %TRUE if a connection can be
* generated later when an IP address is assigned to the interface.
*/
NMConnection *
nm_device_generate_connection(NMDevice *self,
NMDevice *master,

View file

@ -2626,19 +2626,21 @@ get_existing_connection(NMManager *self, NMDevice *device, gboolean *out_generat
}
}
/* The core of the API is nm_device_generate_connection() function and
* update_connection() virtual method and the convenient connection_type
* class attribute. Subclasses supporting the new API must have
* update_connection() implemented, otherwise nm_device_generate_connection()
* returns NULL.
*/
/* The core of the API is nm_device_generate_connection() function, based on
* update_connection() virtual method and the @connection_type_supported
* class attribute. Devices that support assuming existing connections must
* have update_connection() implemented, otherwise
* nm_device_generate_connection() returns NULL. */
connection = nm_device_generate_connection(device, master, &maybe_later, &gen_error);
if (!connection) {
if (maybe_later) {
/* The device can generate a connection, but it failed for now.
* Give it a chance to match a connection from the state file. */
/* The device can potentially assume connections, but at this
* time there are no addresses configured and we can't generate
* a connection. Allow the device to assume a connection indicated
* in the state file by UUID. */
only_by_uuid = TRUE;
} else {
/* The device can't assume connections */
nm_device_assume_state_reset(device);
_LOG2D(LOGD_DEVICE,
device,
@ -2650,15 +2652,8 @@ get_existing_connection(NMManager *self, NMDevice *device, gboolean *out_generat
nm_device_assume_state_get(device, &assume_state_guess_assume, &assume_state_connection_uuid);
/* Now we need to compare the generated connection to each configured
* connection. The comparison function is the heart of the connection
* assumption implementation and it must compare the connections very
* carefully to sort out various corner cases. Also, the comparison is
* not entirely symmetric.
*
* When no configured connection matches the generated connection, we keep
* the generated connection instead.
*/
/* If the device state file indicates a connection that was active before NM
* restarted, perform basic sanity checks on it. */
if (assume_state_connection_uuid
&& (connection_checked =
nm_settings_get_connection_by_uuid(priv->settings, assume_state_connection_uuid))
@ -2692,8 +2687,9 @@ get_existing_connection(NMManager *self, NMDevice *device, gboolean *out_generat
gs_free NMSettingsConnection **sett_conns = NULL;
guint len, i, j;
/* the state file doesn't indicate a connection UUID to assume. Search the
* persistent connections for a matching candidate. */
/* @assume_state_guess_assume=TRUE means this is the first start of NM
* and the state file contains no UUID. Search persistent connections
* for a matching candidate. */
sett_conns = nm_manager_get_activatable_connections(self, FALSE, FALSE, &len);
if (len > 0) {
for (i = 0, j = 0; i < len; i++) {
@ -2766,6 +2762,8 @@ get_existing_connection(NMManager *self, NMDevice *device, gboolean *out_generat
return matched;
}
/* When no configured connection matches the generated connection, we keep
* the generated connection instead. */
_LOG2D(LOGD_DEVICE,
device,
"assume: generated connection '%s' (%s)",