]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: drop list of bridge FDB entries
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 29 Sep 2020 17:01:46 +0000 (02:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 Oct 2020 17:44:42 +0000 (02:44 +0900)
[BridgeFDB] sections are managed by both LIST and Hashmap, and they
contains the completely same information. Let's drop the list.

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

index 43aaebb285c7784c1174c3a1d2f06bc38df2853b..0337ec24a564837b238c065c366a7daa367768a7 100644 (file)
@@ -36,12 +36,8 @@ FdbEntry *fdb_entry_free(FdbEntry *fdb_entry) {
                 return NULL;
 
         if (fdb_entry->network) {
-                LIST_REMOVE(static_fdb_entries, fdb_entry->network->static_fdb_entries, fdb_entry);
-                assert(fdb_entry->network->n_static_fdb_entries > 0);
-                fdb_entry->network->n_static_fdb_entries--;
-
-                if (fdb_entry->section)
-                        hashmap_remove(fdb_entry->network->fdb_entries_by_section, fdb_entry->section);
+                assert(fdb_entry->section);
+                hashmap_remove(fdb_entry->network->fdb_entries_by_section, fdb_entry->section);
         }
 
         network_config_section_free(fdb_entry->section);
@@ -63,23 +59,21 @@ static int fdb_entry_new_static(
 
         assert(network);
         assert(ret);
-        assert(!!filename == (section_line > 0));
-
-        /* search entry in hashmap first. */
-        if (filename) {
-                r = network_config_section_new(filename, section_line, &n);
-                if (r < 0)
-                        return r;
+        assert(filename);
+        assert(section_line > 0);
 
-                fdb_entry = hashmap_get(network->fdb_entries_by_section, n);
-                if (fdb_entry) {
-                        *ret = TAKE_PTR(fdb_entry);
+        r = network_config_section_new(filename, section_line, &n);
+        if (r < 0)
+                return r;
 
-                        return 0;
-                }
+        /* search entry in hashmap first. */
+        fdb_entry = hashmap_get(network->fdb_entries_by_section, n);
+        if (fdb_entry) {
+                *ret = TAKE_PTR(fdb_entry);
+                return 0;
         }
 
-        if (network->n_static_fdb_entries >= STATIC_FDB_ENTRIES_PER_NETWORK_MAX)
+        if (hashmap_size(network->fdb_entries_by_section) >= STATIC_FDB_ENTRIES_PER_NETWORK_MAX)
                 return -E2BIG;
 
         /* allocate space for and FDB entry. */
@@ -90,24 +84,18 @@ static int fdb_entry_new_static(
         /* init FDB structure. */
         *fdb_entry = (FdbEntry) {
                 .network = network,
+                .section = TAKE_PTR(n),
                 .vni = VXLAN_VID_MAX + 1,
                 .fdb_ntf_flags = NEIGHBOR_CACHE_ENTRY_FLAGS_SELF,
         };
 
-        LIST_PREPEND(static_fdb_entries, network->static_fdb_entries, fdb_entry);
-        network->n_static_fdb_entries++;
-
-        if (filename) {
-                fdb_entry->section = TAKE_PTR(n);
-
-                r = hashmap_ensure_allocated(&network->fdb_entries_by_section, &network_config_hash_ops);
-                if (r < 0)
-                        return r;
+        r = hashmap_ensure_allocated(&network->fdb_entries_by_section, &network_config_hash_ops);
+        if (r < 0)
+                return r;
 
-                r = hashmap_put(network->fdb_entries_by_section, fdb_entry->section, fdb_entry);
-                if (r < 0)
-                        return r;
-        }
+        r = hashmap_put(network->fdb_entries_by_section, fdb_entry->section, fdb_entry);
+        if (r < 0)
+                return r;
 
         /* return allocated FDB structure. */
         *ret = TAKE_PTR(fdb_entry);
index 521376cb864053245339e948d39318f263343ad8..c6b5055f8e16fadcfa8ee1621ee75dc358effd44 100644 (file)
@@ -39,8 +39,6 @@ struct FdbEntry {
         struct ether_addr mac_addr;
         union in_addr_union destination_addr;
         NeighborCacheEntryFlags fdb_ntf_flags;
-
-        LIST_FIELDS(FdbEntry, static_fdb_entries);
 };
 
 FdbEntry *fdb_entry_free(FdbEntry *fdb_entry);
index b94e4945f318bd8ea9ce20019b282b2b61b2c340..c47bf75cdffd04f22036dd18f20e912fa3bcf641 100644 (file)
@@ -1136,7 +1136,7 @@ static int link_set_bridge_fdb(Link *link) {
         FdbEntry *fdb_entry;
         int r;
 
-        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
+        HASHMAP_FOREACH(fdb_entry, link->network->fdb_entries_by_section) {
                 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");
index 95f3f653945d17b361eb5c08eb71dc2215b699bb..149c3cf2d31b5952bfeb7c215a888e2451968fe2 100644 (file)
@@ -156,7 +156,7 @@ int network_verify(Network *network) {
         Address *address, *address_next;
         Prefix *prefix, *prefix_next;
         Route *route, *route_next;
-        FdbEntry *fdb, *fdb_next;
+        FdbEntry *fdb;
         MdbEntry *mdb, *mdb_next;
         TrafficControl *tc;
         SRIOV *sr_iov;
@@ -300,7 +300,7 @@ int network_verify(Network *network) {
 
         network_verify_nexthops(network);
 
-        LIST_FOREACH_SAFE(static_fdb_entries, fdb, fdb_next, network->static_fdb_entries)
+        HASHMAP_FOREACH(fdb, network->fdb_entries_by_section)
                 if (section_is_invalid(fdb->section))
                         fdb_entry_free(fdb);
 
@@ -637,7 +637,6 @@ failure:
 static Network *network_free(Network *network) {
         IPv6ProxyNDPAddress *ipv6_proxy_ndp_address;
         RoutePrefix *route_prefix;
-        FdbEntry *fdb_entry;
         MdbEntry *mdb_entry;
         Address *address;
         Prefix *prefix;
@@ -704,9 +703,6 @@ static Network *network_free(Network *network) {
         while ((address = network->static_addresses))
                 address_free(address);
 
-        while ((fdb_entry = network->static_fdb_entries))
-                fdb_entry_free(fdb_entry);
-
         while ((mdb_entry = network->static_mdb_entries))
                 mdb_entry_free(mdb_entry);
 
@@ -722,7 +718,7 @@ static Network *network_free(Network *network) {
         hashmap_free(network->addresses_by_section);
         hashmap_free(network->routes_by_section);
         hashmap_free_with_destructor(network->nexthops_by_section, nexthop_free);
-        hashmap_free(network->fdb_entries_by_section);
+        hashmap_free_with_destructor(network->fdb_entries_by_section, fdb_entry_free);
         hashmap_free(network->mdb_entries_by_section);
         hashmap_free_with_destructor(network->neighbors_by_section, neighbor_free);
         hashmap_free_with_destructor(network->address_labels_by_section, address_label_free);
@@ -849,7 +845,7 @@ bool network_has_static_ipv6_configurations(Network *network) {
                 if (route->family == AF_INET6)
                         return true;
 
-        LIST_FOREACH(static_fdb_entries, fdb, network->static_fdb_entries)
+        HASHMAP_FOREACH(fdb, network->fdb_entries_by_section)
                 if (fdb->family == AF_INET6)
                         return true;
 
index c129338569fd2821ecb67c37d6fa27a89a957ffc..e1d22f18646dd47d212e5a6e5e5effebc36b63a1 100644 (file)
@@ -283,7 +283,6 @@ struct Network {
 
         LIST_HEAD(Address, static_addresses);
         LIST_HEAD(Route, static_routes);
-        LIST_HEAD(FdbEntry, static_fdb_entries);
         LIST_HEAD(MdbEntry, static_mdb_entries);
         LIST_HEAD(IPv6ProxyNDPAddress, ipv6_proxy_ndp_addresses);
         LIST_HEAD(Prefix, static_prefixes);
@@ -291,7 +290,6 @@ struct Network {
 
         unsigned n_static_addresses;
         unsigned n_static_routes;
-        unsigned n_static_fdb_entries;
         unsigned n_static_mdb_entries;
         unsigned n_ipv6_proxy_ndp_addresses;
         unsigned n_static_prefixes;