summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-08-05 00:10:52 +0900
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-08-06 16:40:58 +0200
commit090378dcb1de5ca66900503210e85d63075fa70a (patch)
tree5d017d6d48d7911d019d5473d1bf93a780524fd4
parent0c136b86d6c32445c6b503c87ba5fa348f34e22b (diff)
downloadsystemd-249.3.tar.gz
network: ignore errors on unsetting master ifindexv249.3
Fixes #20241. (cherry picked from commit c347a98272bd1b81682c266b9720fad107b96ab0)
-rw-r--r--src/network/networkd-setlink.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c
index 8130bb6bcc..10c312c480 100644
--- a/src/network/networkd-setlink.c
+++ b/src/network/networkd-setlink.c
@@ -95,9 +95,16 @@ static int set_link_handler_internal(
return 1;
on_error:
- if (op == SET_LINK_FLAGS) {
+ switch (op) {
+ case SET_LINK_FLAGS:
assert(link->set_flags_messages > 0);
link->set_flags_messages--;
+ break;
+ case SET_LINK_MASTER:
+ link->master_set = true;
+ break;
+ default:
+ break;
}
return 0;
@@ -183,6 +190,11 @@ static int link_set_master_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
return set_link_handler_internal(rtnl, m, link, SET_LINK_MASTER, /* ignore = */ false, get_link_master_handler);
}
+static int link_unset_master_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+ /* Some devices do not support setting master ifindex. Let's ignore error on unsetting master ifindex. */
+ return set_link_handler_internal(rtnl, m, link, SET_LINK_MASTER, /* ignore = */ true, get_link_master_handler);
+}
+
static int link_set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
int r;
@@ -745,10 +757,14 @@ int link_request_to_set_mac(Link *link, bool allow_retry) {
int link_request_to_set_master(Link *link) {
assert(link);
+ assert(link->network);
link->master_set = false;
- return link_request_set_link(link, SET_LINK_MASTER, link_set_master_handler, NULL);
+ if (link->network->batadv || link->network->bond || link->network->bridge || link->network->vrf)
+ return link_request_set_link(link, SET_LINK_MASTER, link_set_master_handler, NULL);
+ else
+ return link_request_set_link(link, SET_LINK_MASTER, link_unset_master_handler, NULL);
}
int link_request_to_set_mtu(Link *link, uint32_t mtu) {