]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: Add check to ensure link is down before attempting to enslave (#5853)
authorRoelf Wichertjes <roelf@roelf.org>
Sun, 30 Apr 2017 11:12:32 +0000 (13:12 +0200)
committerLennart Poettering <lennart@poettering.net>
Sun, 30 Apr 2017 11:12:32 +0000 (13:12 +0200)
netdev to bond.

There are situations where a link can be in an "UP" state when
 systemd-networkd attempts to add the link to a bond device.
This is a problem because the bonding driver will refuse to
 enslave a link if it is in the "UP" state.
This check ensures systemd-networkd sets the link to "DOWN"
 before attempting to add the link to the bond.

Fixes #5838.

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

index 3848c863c5da77dbd067e0ede5cf26e9593dc9c4..43884581caf81ab9ae7099ce4aeb2967bc21b6b1 100644 (file)
@@ -28,6 +28,7 @@
 #include "network-internal.h"
 #include "netdev/netdev.h"
 #include "networkd-manager.h"
+#include "networkd-link.h"
 #include "siphash24.h"
 #include "stat-util.h"
 #include "string-table.h"
@@ -221,6 +222,13 @@ static int netdev_enslave_ready(NetDev *netdev, Link* link, sd_netlink_message_h
         assert(link);
         assert(callback);
 
+        if (link->flags & IFF_UP) {
+                log_netdev_debug(netdev, "Link '%s' was up when attempting to enslave it. Bringing link down.", link->ifname);
+                r = link_down(link);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not bring link down: %m");
+        }
+
         r = sd_rtnl_message_new_link(netdev->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not allocate RTM_SETLINK message: %m");
index 48ee12a31777847b2876d50b1c7c0bc848ed9c4d..6ed838094246fcfb94d3b33c82ebedc6e2f2bf1e 100644 (file)
@@ -1644,7 +1644,7 @@ static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
         return 1;
 }
 
-static int link_up(Link *link) {
+int link_up(Link *link) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         uint8_t ipv6ll_mode;
         int r;
@@ -1765,7 +1765,7 @@ static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, void *user
         return 1;
 }
 
-static int link_down(Link *link) {
+int link_down(Link *link) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         int r;
 
index 010b38248a2d32466d03346f68ca1af911c1153c..39c8430ac3293f47de5b3ec36c2b9cfc7e38c9ad 100644 (file)
@@ -140,6 +140,9 @@ int link_get(Manager *m, int ifindex, Link **ret);
 int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
 void link_drop(Link *link);
 
+int link_up(Link *link);
+int link_down(Link *link);
+
 int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
 int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);