bgpd: Simplify BGP community alias handling

Also, warn in CLI an operator if we are trying to overwrite an existing
community alias with an existing alias.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
Donatas Abraitis 2022-05-26 20:15:35 +03:00
parent 5b0f36a8f7
commit 8cfa1e7846

View File

@ -1640,8 +1640,7 @@ DEFPY(bgp_community_alias, bgp_community_alias_cmd,
"Community (AA:BB or AA:BB:CC)\n"
"Alias name\n")
{
struct community_alias ca1;
struct community_alias ca2;
struct community_alias ca = {};
struct community_alias *lookup_community;
struct community_alias *lookup_alias;
struct community *comm;
@ -1663,39 +1662,50 @@ DEFPY(bgp_community_alias, bgp_community_alias_cmd,
return CMD_WARNING;
}
memset(&ca1, 0, sizeof(ca1));
memset(&ca2, 0, sizeof(ca2));
strlcpy(ca1.community, community, sizeof(ca1.community));
strlcpy(ca1.alias, alias_name, sizeof(ca1.alias));
strlcpy(ca.community, community, sizeof(ca.community));
strlcpy(ca.alias, alias_name, sizeof(ca.alias));
lookup_community = bgp_ca_community_lookup(&ca1);
lookup_alias = bgp_ca_alias_lookup(&ca1);
lookup_community = bgp_ca_community_lookup(&ca);
lookup_alias = bgp_ca_alias_lookup(&ca);
if (no) {
bgp_ca_alias_delete(&ca1);
bgp_ca_community_delete(&ca1);
bgp_ca_alias_delete(&ca);
bgp_ca_community_delete(&ca);
} else {
if (lookup_alias) {
/* Lookup if community hash table has an item
* with the same alias name.
*/
strlcpy(ca2.community, lookup_alias->community,
sizeof(ca2.community));
if (bgp_ca_community_lookup(&ca2)) {
strlcpy(ca.community, lookup_alias->community,
sizeof(ca.community));
if (bgp_ca_community_lookup(&ca)) {
vty_out(vty,
"community (%s) already has this alias (%s)\n",
lookup_alias->community,
lookup_alias->alias);
return CMD_WARNING;
}
bgp_ca_alias_delete(&ca1);
bgp_ca_alias_delete(&ca);
}
if (lookup_community)
bgp_ca_community_delete(&ca1);
if (lookup_community) {
/* Lookup if alias hash table has an item
* with the same community.
*/
strlcpy(ca.alias, lookup_community->alias,
sizeof(ca.alias));
if (bgp_ca_alias_lookup(&ca)) {
vty_out(vty,
"alias (%s) already has this community (%s)\n",
lookup_community->alias,
lookup_community->community);
return CMD_WARNING;
}
bgp_ca_community_delete(&ca);
}
bgp_ca_alias_insert(&ca1);
bgp_ca_community_insert(&ca1);
bgp_ca_alias_insert(&ca);
bgp_ca_community_insert(&ca);
}
return CMD_SUCCESS;