diff --git a/src/network/networkd-mdb.c b/src/network/networkd-mdb.c index 0ac770264c..3bf18dbd71 100644 --- a/src/network/networkd-mdb.c +++ b/src/network/networkd-mdb.c @@ -16,12 +16,8 @@ MdbEntry *mdb_entry_free(MdbEntry *mdb_entry) { return NULL; if (mdb_entry->network) { - LIST_REMOVE(static_mdb_entries, mdb_entry->network->static_mdb_entries, mdb_entry); - assert(mdb_entry->network->n_static_mdb_entries > 0); - mdb_entry->network->n_static_mdb_entries--; - - if (mdb_entry->section) - hashmap_remove(mdb_entry->network->mdb_entries_by_section, mdb_entry->section); + assert(mdb_entry->section); + hashmap_remove(mdb_entry->network->mdb_entries_by_section, mdb_entry->section); } network_config_section_free(mdb_entry->section); @@ -44,22 +40,21 @@ static int mdb_entry_new_static( assert(network); assert(ret); - assert(!!filename == (section_line > 0)); + assert(filename); + assert(section_line > 0); + + r = network_config_section_new(filename, section_line, &n); + if (r < 0) + return r; /* search entry in hashmap first. */ - if (filename) { - r = network_config_section_new(filename, section_line, &n); - if (r < 0) - return r; - - mdb_entry = hashmap_get(network->mdb_entries_by_section, n); - if (mdb_entry) { - *ret = TAKE_PTR(mdb_entry); - return 0; - } + mdb_entry = hashmap_get(network->mdb_entries_by_section, n); + if (mdb_entry) { + *ret = TAKE_PTR(mdb_entry); + return 0; } - if (network->n_static_mdb_entries >= STATIC_MDB_ENTRIES_PER_NETWORK_MAX) + if (hashmap_size(network->mdb_entries_by_section) >= STATIC_MDB_ENTRIES_PER_NETWORK_MAX) return -E2BIG; /* allocate space for an MDB entry. */ @@ -70,26 +65,19 @@ static int mdb_entry_new_static( /* init MDB structure. */ *mdb_entry = (MdbEntry) { .network = network, + .section = TAKE_PTR(n), }; - LIST_PREPEND(static_mdb_entries, network->static_mdb_entries, mdb_entry); - network->n_static_mdb_entries++; + r = hashmap_ensure_allocated(&network->mdb_entries_by_section, &network_config_hash_ops); + if (r < 0) + return r; - if (filename) { - mdb_entry->section = TAKE_PTR(n); - - r = hashmap_ensure_allocated(&network->mdb_entries_by_section, &network_config_hash_ops); - if (r < 0) - return r; - - r = hashmap_put(network->mdb_entries_by_section, mdb_entry->section, mdb_entry); - if (r < 0) - return r; - } + r = hashmap_put(network->mdb_entries_by_section, mdb_entry->section, mdb_entry); + if (r < 0) + return r; /* return allocated MDB structure. */ *ret = TAKE_PTR(mdb_entry); - return 0; } @@ -214,7 +202,7 @@ int link_set_bridge_mdb(Link *link) { if (!link->network) return 0; - if (LIST_IS_EMPTY(link->network->static_mdb_entries)) + if (hashmap_isempty(link->network->mdb_entries_by_section)) goto finish; if (!link_has_carrier(link)) @@ -238,7 +226,7 @@ int link_set_bridge_mdb(Link *link) { goto finish; } - LIST_FOREACH(static_mdb_entries, mdb_entry, link->network->static_mdb_entries) { + HASHMAP_FOREACH(mdb_entry, link->network->mdb_entries_by_section) { r = mdb_entry_configure(link, mdb_entry); if (r < 0) return log_link_error_errno(link, r, "Failed to add MDB entry to multicast group database: %m"); diff --git a/src/network/networkd-mdb.h b/src/network/networkd-mdb.h index 70250b5d45..00c16463b8 100644 --- a/src/network/networkd-mdb.h +++ b/src/network/networkd-mdb.h @@ -18,8 +18,6 @@ struct MdbEntry { int family; union in_addr_union group_addr; uint16_t vlan_id; - - LIST_FIELDS(MdbEntry, static_mdb_entries); }; int mdb_entry_verify(MdbEntry *mdb_entry); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 25b0046bd9..7a0feae8fc 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -157,7 +157,7 @@ int network_verify(Network *network) { Address *address, *address_next; Prefix *prefix, *prefix_next; Route *route, *route_next; - MdbEntry *mdb, *mdb_next; + MdbEntry *mdb; TrafficControl *tc; SRIOV *sr_iov; @@ -301,7 +301,7 @@ int network_verify(Network *network) { network_verify_nexthops(network); network_verify_fdb_entries(network); - LIST_FOREACH_SAFE(static_mdb_entries, mdb, mdb_next, network->static_mdb_entries) + HASHMAP_FOREACH(mdb, network->mdb_entries_by_section) if (mdb_entry_verify(mdb) < 0) mdb_entry_free(mdb); @@ -634,7 +634,6 @@ failure: static Network *network_free(Network *network) { IPv6ProxyNDPAddress *ipv6_proxy_ndp_address; RoutePrefix *route_prefix; - MdbEntry *mdb_entry; Address *address; Prefix *prefix; Route *route; @@ -700,9 +699,6 @@ static Network *network_free(Network *network) { while ((address = network->static_addresses)) address_free(address); - while ((mdb_entry = network->static_mdb_entries)) - mdb_entry_free(mdb_entry); - while ((ipv6_proxy_ndp_address = network->ipv6_proxy_ndp_addresses)) ipv6_proxy_ndp_address_free(ipv6_proxy_ndp_address); @@ -716,7 +712,7 @@ static Network *network_free(Network *network) { hashmap_free(network->routes_by_section); hashmap_free_with_destructor(network->nexthops_by_section, nexthop_free); hashmap_free_with_destructor(network->fdb_entries_by_section, fdb_entry_free); - hashmap_free(network->mdb_entries_by_section); + hashmap_free_with_destructor(network->mdb_entries_by_section, mdb_entry_free); hashmap_free_with_destructor(network->neighbors_by_section, neighbor_free); hashmap_free_with_destructor(network->address_labels_by_section, address_label_free); hashmap_free(network->prefixes_by_section); @@ -846,7 +842,7 @@ bool network_has_static_ipv6_configurations(Network *network) { if (fdb->family == AF_INET6) return true; - LIST_FOREACH(static_mdb_entries, mdb, network->static_mdb_entries) + HASHMAP_FOREACH(mdb, network->mdb_entries_by_section) if (mdb->family == AF_INET6) return true; diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index d471c98239..e584e5d460 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -282,14 +282,12 @@ struct Network { LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes); - LIST_HEAD(MdbEntry, static_mdb_entries); LIST_HEAD(IPv6ProxyNDPAddress, ipv6_proxy_ndp_addresses); LIST_HEAD(Prefix, static_prefixes); LIST_HEAD(RoutePrefix, static_route_prefixes); unsigned n_static_addresses; unsigned n_static_routes; - unsigned n_static_mdb_entries; unsigned n_ipv6_proxy_ndp_addresses; unsigned n_static_prefixes; unsigned n_static_route_prefixes;