From: Yu Watanabe Date: Fri, 28 May 2021 18:33:38 +0000 (+0900) Subject: network: set bridge or bond properties after master ifindex is set X-Git-Tag: v249-rc1~76^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=440d40dcc0a3076f55cd32940ba4ab1b224efda2;p=thirdparty%2Fsystemd.git network: set bridge or bond properties after master ifindex is set --- diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index bd6c1b2774e..600b5f5ee12 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -139,6 +139,7 @@ typedef struct Link { bool sr_iov_configured:1; bool can_configured:1; bool activated:1; + bool master_set:1; bool entering_to_join_netdev:1; bool stacked_netdevs_created:1; bool stacked_netdevs_after_configured_created:1; diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index e25f681f50e..1184fbfb43b 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -29,6 +29,12 @@ static int get_link_default_handler(sd_netlink *rtnl, sd_netlink_message *m, Lin return link_getlink_handler_internal(rtnl, m, link, "Failed to sync link information"); } +static int get_link_master_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { + if (get_link_default_handler(rtnl, m, link) > 0) + link->master_set = true; + return 0; +} + static int set_link_handler_internal( sd_netlink *rtnl, sd_netlink_message *m, @@ -118,7 +124,7 @@ static int link_set_mac_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *l } static int link_set_master_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - return set_link_handler_internal(rtnl, m, link, SET_LINK_MASTER, true, get_link_default_handler); + return set_link_handler_internal(rtnl, m, link, SET_LINK_MASTER, true, get_link_master_handler); } static int link_set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { @@ -436,6 +442,12 @@ static bool link_is_ready_to_call_set_link(Request *req) { return false; switch (op) { + case SET_LINK_BOND: + case SET_LINK_BRIDGE: + case SET_LINK_BRIDGE_VLAN: + if (!link->master_set) + return false; + break; case SET_LINK_MASTER: { uint32_t m = 0; @@ -629,6 +641,8 @@ int link_request_to_set_mac(Link *link) { int link_request_to_set_master(Link *link) { assert(link); + link->master_set = false; + return link_request_set_link(link, SET_LINK_MASTER, link_set_master_handler, NULL); }