]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: link - only consider configured when all addresses are ready
authorTom Gundersen <teg@jklm.no>
Mon, 28 Sep 2015 11:38:43 +0000 (13:38 +0200)
committerTom Gundersen <teg@jklm.no>
Wed, 21 Oct 2015 00:35:31 +0000 (02:35 +0200)
We were considering a link configured whilst its IPv6 addresses were still
tentative.

Fixes issue #650.

src/network/networkd-address.c
src/network/networkd-dhcp4.c
src/network/networkd-dhcp6.c
src/network/networkd-ipv4ll.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-manager.c

index 316ae2e4cb2d013177552a624810c2a738e2a8e3..f1b364f40ed91a3b0244ace0d6a4a06346026b9e 100644 (file)
@@ -283,11 +283,20 @@ static int address_release(Address *address, Link *link) {
 }
 
 int address_drop(Address *address) {
+        Link *link;
+        bool ready;
+
         assert(address);
 
+        ready = address_is_ready(address);
+        link = address->link;
+
         address_release(address, address->link);
         address_free(address);
 
+        if (link && !ready)
+                link_check_ready(link);
+
         return 0;
 }
 
index 5d9bfcea7c9f70dc0bd625b5acac12972a8f490b..e2f7d696667b7ebc77a5775fbf74418e00853d09 100644 (file)
@@ -45,7 +45,7 @@ static int dhcp4_route_handler(sd_netlink *rtnl, sd_netlink_message *m,
 
         if (!link->dhcp4_messages) {
                 link->dhcp4_configured = true;
-                link_client_handler(link);
+                link_check_ready(link);
         }
 
         return 1;
index 2f9ecf7a89749e193f1029a5e44719b7e81691ca..8115232e1da130749efd14570e547d8014a9d9af 100644 (file)
@@ -176,7 +176,7 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
                 return;
         }
 
-        link_client_handler(link);
+        link_check_ready(link);
 }
 
 static int dhcp6_configure(Link *link, int event) {
index 01ee9f9f4ad60cedca06c3d93d5abe92bb8f3295..752c09d6b1f859245dc2d1e30f07bafc7a91aca9 100644 (file)
@@ -67,7 +67,7 @@ static int ipv4ll_address_lost(Link *link) {
 
         route_remove(route, link, &link_route_remove_handler);
 
-        link_client_handler(link);
+        link_check_ready(link);
 
         return 0;
 }
@@ -88,7 +88,7 @@ static int ipv4ll_route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *u
         link->ipv4ll_route = true;
 
         if (link->ipv4ll_address == true)
-                link_client_handler(link);
+                link_check_ready(link);
 
         return 1;
 }
@@ -110,7 +110,7 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, void
         link->ipv4ll_address = true;
 
         if (link->ipv4ll_route == true)
-                link_client_handler(link);
+                link_check_ready(link);
 
         return 1;
 }
index 9d97089576c75e2d55f074544a7a5a1d8b8fafce..9661704f526c42ffeaa29ff6dae697d1885d8769 100644 (file)
@@ -503,7 +503,10 @@ static int link_enter_configured(Link *link) {
         return 0;
 }
 
-void link_client_handler(Link *link) {
+void link_check_ready(Link *link) {
+        Address *a;
+        Iterator i;
+
         assert(link);
         assert(link->network);
 
@@ -523,6 +526,10 @@ void link_client_handler(Link *link) {
              !link->dhcp4_configured && !link->dhcp6_configured))
                 return;
 
+        SET_FOREACH(a, link->addresses, i)
+                if (!address_is_ready(a))
+                        return;
+
         if (link->state != LINK_STATE_CONFIGURED)
                 link_enter_configured(link);
 
@@ -550,7 +557,7 @@ static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata
         if (link->link_messages == 0) {
                 log_link_debug(link, "Routes set");
                 link->static_configured = true;
-                link_client_handler(link);
+                link_check_ready(link);
         }
 
         return 1;
@@ -579,7 +586,7 @@ static int link_enter_set_routes(Link *link) {
 
         if (link->link_messages == 0) {
                 link->static_configured = true;
-                link_client_handler(link);
+                link_check_ready(link);
         } else
                 log_link_debug(link, "Setting routes");
 
index b81bae38309b14a5c8af3c01b1a04ec156858885..a94bb2f714164a3df9db870bc7772ff84bbd8b70 100644 (file)
@@ -126,7 +126,7 @@ int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *use
 void link_enter_failed(Link *link);
 int link_initialized(Link *link, struct udev_device *device);
 
-void link_client_handler(Link *link);
+void link_check_ready(Link *link);
 
 int link_update(Link *link, sd_netlink_message *message);
 
index 07e47b668c1692df20804928189c17ee43d4fbdf..2cd4f4fef7677efecabf3a1674704947d11a0d0b 100644 (file)
@@ -404,6 +404,7 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
                         address->flags = flags;
                         address->cinfo = cinfo;
 
+                        link_check_ready(link);
                 } else {
                         r = address_add(link, family, &in_addr, prefixlen, &address);
                         if (r < 0) {
@@ -416,7 +417,7 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
                         address->flags = flags;
                         address->cinfo = cinfo;
 
-                        link_save(link);
+                        link_check_ready(link);
                 }
 
                 break;