]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: old kernel may not support to configure bridge MDB entries on bridge master
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Sep 2020 09:02:09 +0000 (18:02 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Sep 2020 09:15:22 +0000 (18:15 +0900)
src/network/networkd-manager.h
src/network/networkd-mdb.c

index f4b37bd6a9577f4c3510b437f3f4781ef81de1cc..255a0d965f9105be47429fbe8a80c633c0fe4160 100644 (file)
@@ -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);
index 7b0c10a4af33dd6f12c74e01c293b12b984786e1..542ba75ad0f8ab51a4218730f6f74c5911b7fb72 100644 (file)
@@ -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) {