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