From ee4522ce86fa8735006b51d066b04de93fcd7261 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 30 Sep 2020 02:44:57 +0900 Subject: [PATCH] network: introduce network_verify_mdb_entries() --- src/network/networkd-mdb.c | 76 +++++++++++++++++++--------------- src/network/networkd-mdb.h | 4 +- src/network/networkd-network.c | 7 +--- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/network/networkd-mdb.c b/src/network/networkd-mdb.c index 3bf18dbd71..31234ba3bc 100644 --- a/src/network/networkd-mdb.c +++ b/src/network/networkd-mdb.c @@ -243,6 +243,49 @@ finish: return 0; } +static int mdb_entry_verify(MdbEntry *mdb_entry) { + if (section_is_invalid(mdb_entry->section)) + return -EINVAL; + + if (mdb_entry->family == AF_UNSPEC) + return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), + "%s: [BridgeMDB] section without MulticastGroupAddress= field configured. " + "Ignoring [BridgeMDB] section from line %u.", + mdb_entry->section->filename, mdb_entry->section->line); + + if (!in_addr_is_multicast(mdb_entry->family, &mdb_entry->group_addr)) + return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), + "%s: MulticastGroupAddress= is not a multicast address. " + "Ignoring [BridgeMDB] section from line %u.", + mdb_entry->section->filename, mdb_entry->section->line); + + if (mdb_entry->family == AF_INET) { + if (in4_addr_is_local_multicast(&mdb_entry->group_addr.in)) + return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), + "%s: MulticastGroupAddress= is a local multicast address. " + "Ignoring [BridgeMDB] section from line %u.", + mdb_entry->section->filename, mdb_entry->section->line); + } else { + if (in6_addr_is_link_local_all_nodes(&mdb_entry->group_addr.in6)) + return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), + "%s: MulticastGroupAddress= is the multicast all nodes address. " + "Ignoring [BridgeMDB] section from line %u.", + mdb_entry->section->filename, mdb_entry->section->line); + } + + return 0; +} + +void network_verify_mdb_entries(Network *network) { + MdbEntry *mdb_entry; + + assert(network); + + HASHMAP_FOREACH(mdb_entry, network->mdb_entries_by_section) + if (mdb_entry_verify(mdb_entry) < 0) + mdb_entry_free(mdb_entry); +} + /* parse the VLAN Id from config files. */ int config_parse_mdb_vlan_id( const char *unit, @@ -318,36 +361,3 @@ int config_parse_mdb_group_address( return 0; } - -int mdb_entry_verify(MdbEntry *mdb_entry) { - if (section_is_invalid(mdb_entry->section)) - return -EINVAL; - - if (mdb_entry->family == AF_UNSPEC) - return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: [BridgeMDB] section without MulticastGroupAddress= field configured. " - "Ignoring [BridgeMDB] section from line %u.", - mdb_entry->section->filename, mdb_entry->section->line); - - if (!in_addr_is_multicast(mdb_entry->family, &mdb_entry->group_addr)) - return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: MulticastGroupAddress= is not a multicast address. " - "Ignoring [BridgeMDB] section from line %u.", - mdb_entry->section->filename, mdb_entry->section->line); - - if (mdb_entry->family == AF_INET) { - if (in4_addr_is_local_multicast(&mdb_entry->group_addr.in)) - return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: MulticastGroupAddress= is a local multicast address. " - "Ignoring [BridgeMDB] section from line %u.", - mdb_entry->section->filename, mdb_entry->section->line); - } else { - if (in6_addr_is_link_local_all_nodes(&mdb_entry->group_addr.in6)) - return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), - "%s: MulticastGroupAddress= is the multicast all nodes address. " - "Ignoring [BridgeMDB] section from line %u.", - mdb_entry->section->filename, mdb_entry->section->line); - } - - return 0; -} diff --git a/src/network/networkd-mdb.h b/src/network/networkd-mdb.h index 00c16463b8..b3d0513293 100644 --- a/src/network/networkd-mdb.h +++ b/src/network/networkd-mdb.h @@ -20,8 +20,10 @@ struct MdbEntry { uint16_t vlan_id; }; -int mdb_entry_verify(MdbEntry *mdb_entry); MdbEntry *mdb_entry_free(MdbEntry *mdb_entry); + +void network_verify_mdb_entries(Network *network); + int link_set_bridge_mdb(Link *link); CONFIG_PARSER_PROTOTYPE(config_parse_mdb_group_address); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 7a0feae8fc..67acb1e761 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -157,7 +157,6 @@ int network_verify(Network *network) { Address *address, *address_next; Prefix *prefix, *prefix_next; Route *route, *route_next; - MdbEntry *mdb; TrafficControl *tc; SRIOV *sr_iov; @@ -300,11 +299,7 @@ int network_verify(Network *network) { network_verify_nexthops(network); network_verify_fdb_entries(network); - - HASHMAP_FOREACH(mdb, network->mdb_entries_by_section) - if (mdb_entry_verify(mdb) < 0) - mdb_entry_free(mdb); - + network_verify_mdb_entries(network); network_verify_neighbors(network); network_verify_address_labels(network);