diff --git a/bgpd/bgp_memory.c b/bgpd/bgp_memory.c index 1dc992fb94..b9f1ba3971 100644 --- a/bgpd/bgp_memory.c +++ b/bgpd/bgp_memory.c @@ -65,7 +65,7 @@ DEFINE_MTYPE(BGPD, AS_LIST, "BGP AS list"); DEFINE_MTYPE(BGPD, AS_FILTER, "BGP AS filter"); DEFINE_MTYPE(BGPD, AS_FILTER_STR, "BGP AS filter str"); -DEFINE_MTYPE(BGPD, COMMUNITY_ALIAS, "community"); +DEFINE_MTYPE(BGPD, COMMUNITY_ALIAS, "community alias"); DEFINE_MTYPE(BGPD, COMMUNITY, "community"); DEFINE_MTYPE(BGPD, COMMUNITY_VAL, "community val"); diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 9cfec0fe2f..0a4083e5f6 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -1640,49 +1640,72 @@ 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; + struct lcommunity *lcomm; + uint8_t invalid = 0; - if (!community_str2com(community) && !lcommunity_str2com(community)) { + comm = community_str2com(community); + if (!comm) + invalid++; + community_free(&comm); + + lcomm = lcommunity_str2com(community); + if (!lcomm) + invalid++; + lcommunity_free(&lcomm); + + if (invalid > 1) { vty_out(vty, "Invalid community format\n"); 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;