networkd: Wait for DHCPv6 before announcing link configured
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 23 Sep 2015 11:52:03 +0000 (14:52 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 23 Sep 2015 12:24:04 +0000 (15:24 +0300)
Wait until DHCPv6 has acquired an address before announcing the link
to be configured. Log the DHCPv6 lease lost event.

src/network/networkd-dhcp6.c
src/network/networkd-link.c
src/network/networkd-link.h

index 1d85fef..13105c7 100644 (file)
@@ -147,7 +147,9 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
         case SD_DHCP6_CLIENT_EVENT_STOP:
         case SD_DHCP6_CLIENT_EVENT_RESEND_EXPIRE:
         case SD_DHCP6_CLIENT_EVENT_RETRANS_MAX:
-                log_link_debug(link, "DHCPv6 event %d", event);
+                log_link_warning(link, "DHCPv6 lease lost");
+
+                link->dhcp6_configured = false;
                 break;
 
         case SD_DHCP6_CLIENT_EVENT_IP_ACQUIRE:
@@ -165,6 +167,7 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
                         return;
                 }
 
+                link->dhcp6_configured = true;
                 break;
 
         default:
@@ -176,6 +179,8 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
                                          event);
                 return;
         }
+
+        link_client_handler(link);
 }
 
 static int dhcp6_configure(Link *link, int event) {
@@ -187,6 +192,8 @@ static int dhcp6_configure(Link *link, int event) {
                              SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_OTHER,
                              SD_ICMP6_ND_EVENT_ROUTER_ADVERTISMENT_MANAGED), -EINVAL);
 
+        link->dhcp6_configured = false;
+
         if (link->dhcp6_client) {
                 r = sd_dhcp6_client_get_information_request(link->dhcp6_client,
                                                         &information_request);
@@ -221,6 +228,9 @@ static int dhcp6_configure(Link *link, int event) {
                         goto error;
                 }
 
+                if (r == -EALREADY)
+                        link->dhcp6_configured = true;
+
                 return r;
         }
 
index 86f1c3b..0a7e75c 100644 (file)
@@ -504,6 +504,9 @@ void link_client_handler(Link *link) {
         if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
                         return;
 
+        if (link_dhcp6_enabled(link) && !link->dhcp6_configured)
+                return;
+
         if (link->state != LINK_STATE_CONFIGURED)
                 link_enter_configured(link);
 
index f588faf..7b219c6 100644 (file)
@@ -91,6 +91,7 @@ struct Link {
         uint16_t original_mtu;
         unsigned dhcp4_messages;
         bool dhcp4_configured;
+        bool dhcp6_configured;
 
         sd_ipv4ll *ipv4ll;
         bool ipv4ll_address;