network: introduce network_verify_mdb_entries()
This commit is contained in:
parent
03c9738e1d
commit
ee4522ce86
|
@ -243,6 +243,49 @@ finish:
|
||||||
return 0;
|
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. */
|
/* parse the VLAN Id from config files. */
|
||||||
int config_parse_mdb_vlan_id(
|
int config_parse_mdb_vlan_id(
|
||||||
const char *unit,
|
const char *unit,
|
||||||
|
@ -318,36 +361,3 @@ int config_parse_mdb_group_address(
|
||||||
|
|
||||||
return 0;
|
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,8 +20,10 @@ struct MdbEntry {
|
||||||
uint16_t vlan_id;
|
uint16_t vlan_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
int mdb_entry_verify(MdbEntry *mdb_entry);
|
|
||||||
MdbEntry *mdb_entry_free(MdbEntry *mdb_entry);
|
MdbEntry *mdb_entry_free(MdbEntry *mdb_entry);
|
||||||
|
|
||||||
|
void network_verify_mdb_entries(Network *network);
|
||||||
|
|
||||||
int link_set_bridge_mdb(Link *link);
|
int link_set_bridge_mdb(Link *link);
|
||||||
|
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_mdb_group_address);
|
CONFIG_PARSER_PROTOTYPE(config_parse_mdb_group_address);
|
||||||
|
|
|
@ -157,7 +157,6 @@ int network_verify(Network *network) {
|
||||||
Address *address, *address_next;
|
Address *address, *address_next;
|
||||||
Prefix *prefix, *prefix_next;
|
Prefix *prefix, *prefix_next;
|
||||||
Route *route, *route_next;
|
Route *route, *route_next;
|
||||||
MdbEntry *mdb;
|
|
||||||
TrafficControl *tc;
|
TrafficControl *tc;
|
||||||
SRIOV *sr_iov;
|
SRIOV *sr_iov;
|
||||||
|
|
||||||
|
@ -300,11 +299,7 @@ int network_verify(Network *network) {
|
||||||
|
|
||||||
network_verify_nexthops(network);
|
network_verify_nexthops(network);
|
||||||
network_verify_fdb_entries(network);
|
network_verify_fdb_entries(network);
|
||||||
|
network_verify_mdb_entries(network);
|
||||||
HASHMAP_FOREACH(mdb, network->mdb_entries_by_section)
|
|
||||||
if (mdb_entry_verify(mdb) < 0)
|
|
||||||
mdb_entry_free(mdb);
|
|
||||||
|
|
||||||
network_verify_neighbors(network);
|
network_verify_neighbors(network);
|
||||||
network_verify_address_labels(network);
|
network_verify_address_labels(network);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue