chiark / gitweb /
networkd/sd-dhcp-server: only start dhcp server when necessary
[elogind.git] / src / network / networkd-link.c
index 664cc07c724ceb39d6bf63a568d30e5273353504..55274893644ee66208f262772472f88a59b43219 100644 (file)
@@ -124,8 +124,8 @@ static void link_free(Link *link) {
         free(link->lease_file);
 
         sd_ipv4ll_unref(link->ipv4ll);
-
         sd_dhcp6_client_unref(link->dhcp6_client);
+        sd_icmp6_nd_unref(link->icmp6_router_discovery);
 
         hashmap_remove(link->manager->links, &link->ifindex);
 
@@ -236,11 +236,19 @@ static int link_stop_clients(Link *link) {
         }
 
         if (link->network->dhcp6) {
-                assert(link->dhcp6_client);
+                assert(link->icmp6_router_discovery);
+
+                if (link->dhcp6_client) {
+                        k = sd_dhcp6_client_stop(link->dhcp6_client);
+                        if (k < 0) {
+                                log_warning_link(link, "Could not stop DHCPv6 client: %s", strerror(-r));
+                                r = k;
+                        }
+                }
 
-                k = sd_dhcp6_client_stop(link->dhcp6_client);
+                k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
                 if (k < 0) {
-                        log_warning_link(link, "Could not stop DHCPv6 client: %s", strerror(-r));
+                        log_warning_link(link, "Could not stop ICMPv6 router discovery: %s", strerror(-r));
                         r = k;
                 }
         }
@@ -299,7 +307,8 @@ static int link_enter_configured(Link *link) {
         assert(link->network);
         assert(link->state == LINK_STATE_SETTING_ROUTES);
 
-        if (link->network->dhcp_server) {
+        if (link->network->dhcp_server &&
+            !sd_dhcp_server_is_running(link->dhcp_server)) {
                 struct in_addr pool_start;
                 Address *address;