From 5329a37935b5b4d1fca64ddc0ba952d17c6dc587 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Dec 2021 05:57:29 +0900 Subject: [PATCH 1/4] network: set MAC address before enslaving to bond or bridge interface As the master interface may inherit the slave MAC address. --- src/network/networkd-setlink.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index ff4eecf9b3..77451e39ae 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -568,12 +568,19 @@ static bool link_is_ready_to_call_set_link(Request *req) { break; case SET_LINK_MASTER: { uint32_t m = 0; + Request req_mac = { + .link = link, + .type = REQUEST_TYPE_SET_LINK, + .set_link_operation_ptr = INT_TO_PTR(SET_LINK_MAC), + }; if (link->network->batadv) { if (!netdev_is_ready(link->network->batadv)) return false; m = link->network->batadv->ifindex; } else if (link->network->bond) { + if (ordered_set_contains(link->manager->request_queue, &req_mac)) + return false; if (!netdev_is_ready(link->network->bond)) return false; m = link->network->bond->ifindex; @@ -589,6 +596,8 @@ static bool link_is_ready_to_call_set_link(Request *req) { } } } else if (link->network->bridge) { + if (ordered_set_contains(link->manager->request_queue, &req_mac)) + return false; if (!netdev_is_ready(link->network->bridge)) return false; m = link->network->bridge->ifindex; From 879377cad531aabbf85a140201b0ea3ff9a8c3d2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Dec 2021 05:34:08 +0900 Subject: [PATCH 2/4] network: do not block configuring addresses by creating stacked netdevs `link_is_ready_to_configure()` is used to judge we can configure addresses, routes, and etc. And they can be configured independently of stacked netdevs. --- src/network/networkd-link.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index f0e1d9bcd4..c2b632ba5b 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -172,9 +172,6 @@ bool link_is_ready_to_configure(Link *link, bool allow_unmanaged) { if (link->set_link_messages > 0) return false; - if (!link->stacked_netdevs_created) - return false; - if (!link->activated) return false; @@ -441,6 +438,9 @@ void link_check_ready(Link *link) { return; } + if (!link->stacked_netdevs_created) + return (void) log_link_debug(link, "%s(): stacked netdevs are not created.", __func__); + if (!link->static_addresses_configured) return (void) log_link_debug(link, "%s(): static addresses are not configured.", __func__); From f7144e7b0f146799ffde7cda13788fd9712c4326 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Dec 2021 05:47:31 +0900 Subject: [PATCH 3/4] network/netdev: create stacked netdevs after all set-link operations are finished E.g. setting MAC address must be done before creating VLAN interface. --- src/network/netdev/netdev.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 9f9519fa50..7797f2a693 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -612,8 +612,6 @@ int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callb } static bool netdev_is_ready_to_create(NetDev *netdev, Link *link) { - Request req; - assert(netdev); assert(link); @@ -625,13 +623,7 @@ static bool netdev_is_ready_to_create(NetDev *netdev, Link *link) { link->state != LINK_STATE_CONFIGURED) return false; - req = (Request) { - .link = link, - .type = REQUEST_TYPE_SET_LINK, - .set_link_operation_ptr = INT_TO_PTR(SET_LINK_MTU), - }; - - if (ordered_set_contains(link->manager->request_queue, &req)) + if (link->set_link_messages > 0) return false; return true; From 543240f5939f545623985d30c677784126c98eca Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Dec 2021 07:18:29 +0900 Subject: [PATCH 4/4] network/netdev: drop spurious state from the condition to create stacked netdevs Stacked netdevs are requested when the underlying interface is in configuring state. --- src/network/netdev/netdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 7797f2a693..b4121dd473 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -617,8 +617,10 @@ static bool netdev_is_ready_to_create(NetDev *netdev, Link *link) { if (netdev->state != NETDEV_STATE_LOADING) return false; - if (!IN_SET(link->state, LINK_STATE_INITIALIZED, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) + + if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) return false; + if (netdev_get_create_type(netdev) == NETDEV_CREATE_AFTER_CONFIGURED && link->state != LINK_STATE_CONFIGURED) return false;