From 8cfa1e78463844518bb95d59fee2da440bbd208e Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 26 May 2022 20:15:35 +0300 Subject: [PATCH] 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 --- bgpd/bgp_vty.c | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index c013160d95..0a4083e5f6 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -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;