diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-09-17 18:02:09 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-09-17 18:15:22 +0900 |
commit | 1797240104ba3472728ce7f52311a5db8969e0a4 (patch) | |
tree | 83a64f1fdc65a53b51c357926452cc1b26fa7ffe | |
parent | a55100e66c80a8aa9df996f67e8673439013a595 (diff) | |
download | systemd-1797240104ba3472728ce7f52311a5db8969e0a4.tar.gz |
network: old kernel may not support to configure bridge MDB entries on bridge master
-rw-r--r-- | src/network/networkd-manager.h | 3 | ||||
-rw-r--r-- | src/network/networkd-mdb.c | 12 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index f4b37bd6a9..255a0d965f 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -69,7 +69,8 @@ struct Manager { usec_t speed_meter_usec_new; usec_t speed_meter_usec_old; - bool dhcp4_prefix_root_cannot_set_table; + bool dhcp4_prefix_root_cannot_set_table:1; + bool bridge_mdb_on_master_not_supported:1; }; int manager_new(Manager **ret); diff --git a/src/network/networkd-mdb.c b/src/network/networkd-mdb.c index 7b0c10a4af..542ba75ad0 100644 --- a/src/network/networkd-mdb.c +++ b/src/network/networkd-mdb.c @@ -103,7 +103,13 @@ static int set_mdb_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) return 1; r = sd_netlink_message_get_errno(m); - if (r < 0 && r != -EEXIST) { + if (r == -EINVAL && streq_ptr(link->kind, "bridge") && (!link->network || !link->network->bridge)) { + /* To configure bridge MDB entries on bridge master, 1bc844ee0faa1b92e3ede00bdd948021c78d7088 (v5.4) is required. */ + if (!link->manager->bridge_mdb_on_master_not_supported) { + log_link_warning_errno(link, r, "Kernel seems not to support configuring bridge MDB entries on bridge master, ignoring: %m"); + link->manager->bridge_mdb_on_master_not_supported = true; + } + } else if (r < 0 && r != -EEXIST) { log_link_message_warning_errno(link, m, r, "Could not add MDB entry"); link_enter_failed(link); return 1; @@ -199,6 +205,7 @@ int link_set_bridge_mdb(Link *link) { int r; assert(link); + assert(link->manager); link->bridge_mdb_configured = false; @@ -224,6 +231,9 @@ int link_set_bridge_mdb(Link *link) { } else if (!streq_ptr(link->kind, "bridge")) { log_link_warning(link, "Link is neither a bridge master nor a bridge port, ignoring [BridgeMDB] sections."); goto finish; + } else if (link->manager->bridge_mdb_on_master_not_supported) { + log_link_debug(link, "Kernel seems not to support configuring bridge MDB entries on bridge master, ignoring [BridgeMDB] sections."); + goto finish; } LIST_FOREACH(static_mdb_entries, mdb_entry, link->network->static_mdb_entries) { |