manager: fix assumption of child connections with autoconnect=no
authorBeniamino Galvani <bgalvani@redhat.com>
Tue, 8 Mar 2016 11:02:54 +0000 (12:02 +0100)
committerBeniamino Galvani <bgalvani@redhat.com>
Wed, 9 Mar 2016 08:48:44 +0000 (09:48 +0100)
During startup, when a link is detected (enp0s25 in the example below)
we try to create also virtual devices (ipip1) on it through
system_create_virtual_device(), however this realizes only devices for
connections which can autoactivate.

To support the assumption of child devices with autoconnect=no, we
should take in consideration in retry_connections_for_parent_device()
only connections for which the link does not exist, and let existing
links be handled by platform_link_added(), which also realizes them.

Reproducer:
 $ nmcli c add type ip-tunnel ifname ipip1 con-name ipip1+ autoconnect no \
               mode ipip remote 172.25.16.1 dev enp0s25 ip4 1.2.3.4/31
 $ nmcli c up ipip1+
 $ systemctl restart NetworkManager

Result:
 * before: ipip1+ is not assumed, ipip1 is not present in 'nmcli d' output
 * after:  ipip1+ is assumed, ipip1 detected

src/nm-manager.c

index 6d7f96c..409079a 100644 (file)
@@ -1136,11 +1136,19 @@ retry_connections_for_parent_device (NMManager *self, NMDevice *device)
        connections = nm_settings_get_connections (priv->settings);
        for (iter = connections; iter; iter = g_slist_next (iter)) {
                NMConnection *candidate = iter->data;
+               gs_free_error GError *error = NULL;
+               gs_free char *ifname = NULL;
                NMDevice *parent;
 
                parent = find_parent_device_for_connection (self, candidate, NULL);
-               if (parent == device)
-                       connection_changed (priv->settings, candidate, self);
+               if (parent == device) {
+                       /* Only try to activate devices that don't already exist */
+                       ifname = nm_manager_get_connection_iface (self, candidate, &parent, &error);
+                       if (ifname) {
+                               if (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, ifname))
+                                       connection_changed (priv->settings, candidate, self);
+                       }
+               }
        }
 
        g_slist_free (connections);