network: drop list of bridge MDB entries
[BridgeMDB] sections are managed by LIST and Hashmap, and they contins the completely same information. Let's drop the list.
This commit is contained in:
parent
8c06da1cd1
commit
03c9738e1d
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue