]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: use BridgeFDB as well on bridge ports (#4253)
authorTobias Jungel <Tobias.Jungel@gmail.com>
Wed, 5 Oct 2016 15:06:40 +0000 (17:06 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 5 Oct 2016 15:06:40 +0000 (17:06 +0200)
[BridgeFDB] did not apply to bridge ports so far. This patch adds the proper
handling. In case of a bridge interface the correct flag NTF_MASTER is now set
in the netlink call. FDB MAC addresses are now applied in
link_enter_set_addresses to make sure the link is setup.

src/network/networkd-fdb.c
src/network/networkd-link.c

index be8aebee2d81a89a9fb0b73cb46042444a92052d..ed5a47589e6a4abbe95483b4b6309dd6e0ec6743 100644 (file)
@@ -107,20 +107,28 @@ int fdb_entry_configure(Link *link, FdbEntry *fdb_entry) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         sd_netlink *rtnl;
         int r;
+        uint8_t flags;
+        Bridge *bridge;
 
         assert(link);
+        assert(link->network);
         assert(link->manager);
         assert(fdb_entry);
 
         rtnl = link->manager->rtnl;
+        bridge = BRIDGE(link->network->bridge);
 
         /* create new RTM message */
         r = sd_rtnl_message_new_neigh(rtnl, &req, RTM_NEWNEIGH, link->ifindex, PF_BRIDGE);
         if (r < 0)
                 return rtnl_log_create_error(r);
 
-        /* only NTF_SELF flag supported. */
-        r = sd_rtnl_message_neigh_set_flags(req, NTF_SELF);
+        if (bridge)
+                flags = NTF_MASTER;
+        else
+                flags = NTF_SELF;
+
+        r = sd_rtnl_message_neigh_set_flags(req, flags);
         if (r < 0)
                 return rtnl_log_create_error(r);
 
index 9cd4aa2c39caf95fe67b8304096f3c8e0b31cfb3..25f46c093e1c33498f5a15e5786e27cb77a2ab19 100644 (file)
@@ -942,6 +942,20 @@ static int link_push_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {
         return sd_dhcp_server_set_ntp(s, addresses, n_addresses);
 }
 
+static int link_set_bridge_fdb(Link *link) {
+        FdbEntry *fdb_entry;
+        int r = 0;
+
+        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
+                r = fdb_entry_configure(link, fdb_entry);
+                if (r < 0) {
+                        return log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
+                }
+        }
+
+        return r;
+}
+
 static int link_enter_set_addresses(Link *link) {
         Address *ad;
         int r;
@@ -950,6 +964,10 @@ static int link_enter_set_addresses(Link *link) {
         assert(link->network);
         assert(link->state != _LINK_STATE_INVALID);
 
+        r = link_set_bridge_fdb(link);
+        if (r < 0)
+                return r;
+
         link_set_state(link, LINK_STATE_SETTING_ADDRESSES);
 
         LIST_FOREACH(addresses, ad, link->network->static_addresses) {
@@ -1119,21 +1137,6 @@ static int link_set_bridge_vlan(Link *link) {
         return r;
 }
 
-static int link_set_bridge_fdb(Link *link) {
-        FdbEntry *fdb_entry;
-        int r = 0;
-
-        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
-                r = fdb_entry_configure(link, fdb_entry);
-                if (r < 0) {
-                        log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
-                        break;
-                }
-        }
-
-        return r;
-}
-
 static int link_set_proxy_arp(Link *link) {
         const char *p = NULL;
         int r;
@@ -2477,10 +2480,6 @@ static int link_configure(Link *link) {
                         return r;
         }
 
-        r = link_set_bridge_fdb(link);
-        if (r < 0)
-                return r;
-
         r = link_set_proxy_arp(link);
         if (r < 0)
                return r;