We have to convert BGP alias to numerical format to compare in regexp.
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
#include "bgpd/bgp_community.h"
#include "bgpd/bgp_ecommunity.h"
#include "bgpd/bgp_lcommunity.h"
+#include "bgpd/bgp_community_alias.h"
#include "bgpd/bgp_aspath.h"
#include "bgpd/bgp_regex.h"
#include "bgpd/bgp_clist.h"
str = community_str(com, false);
/* Regular expression match. */
- if (regexec(reg, str, 0, NULL, 0) == 0)
+ if (regexec(reg, bgp_alias2community_str(str), 0, NULL, 0) == 0)
return true;
/* No match. */
str = lcommunity_str(com, false);
/* Regular expression match. */
- if (regexec(reg, str, 0, NULL, 0) == 0)
+ if (regexec(reg, bgp_alias2community_str(str), 0, NULL, 0) == 0)
return true;
/* No match. */
#include "memory.h"
#include "lib/jhash.h"
+#include "frrstr.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_community_alias.h"
return community;
}
+const char *bgp_alias2community(char *alias)
+{
+ struct community_alias ca;
+ struct community_alias *find;
+
+ memset(&ca, 0, sizeof(ca));
+ strlcpy(ca.alias, alias, sizeof(ca.alias));
+
+ find = bgp_ca_alias_lookup(&ca);
+ if (find)
+ return find->community;
+
+ return alias;
+}
+
+/* Communities structs have `->str` which is used
+ * for vty outputs and extended BGP community lists
+ * with regexp.
+ * This is a helper to convert already aliased version
+ * of communities into numerical-only format.
+ */
+const char *bgp_alias2community_str(const char *str)
+{
+ char **aliases;
+ int num;
+
+ frrstr_split(str, " ", &aliases, &num);
+ const char *communities[num + 1];
+
+ for (int i = 0; i < num; i++) {
+ communities[i] =
+ XSTRDUP(MTYPE_TMP, bgp_alias2community(aliases[i]));
+ XFREE(MTYPE_TMP, aliases[i]);
+ }
+ XFREE(MTYPE_TMP, aliases);
+
+ return frrstr_join(communities, num, " ");
+}
+
static int bgp_community_alias_vector_walker(struct hash_bucket *bucket,
void *data)
{
extern void bgp_ca_alias_delete(struct community_alias *ca);
extern int bgp_community_alias_write(struct vty *vty);
extern const char *bgp_community2alias(char *community);
+extern const char *bgp_alias2community(char *alias);
+extern const char *bgp_alias2community_str(const char *str);
extern void bgp_community_alias_command_completion_setup(void);
#endif /* FRR_BGP_COMMUNITY_ALIAS_H */