summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_clist.c64
-rw-r--r--bgpd/bgp_clist.h2
-rw-r--r--bgpd/bgp_vty.c2
3 files changed, 68 insertions, 0 deletions
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 50122ad7da..1fb55ddf7d 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -1372,3 +1372,67 @@ void community_list_terminate(struct community_list_handler *ch)
XFREE(MTYPE_COMMUNITY_LIST_HANDLER, ch);
}
+
+static int bgp_community_list_vector_walker(struct hash_bucket *bucket,
+ void *data)
+{
+ vector *comps = data;
+ struct community_list *list = bucket->data;
+
+ vector_set(*comps, XSTRDUP(MTYPE_COMPLETION, list->name));
+
+ return 1;
+}
+
+static void bgp_community_list_cmd_completion(vector comps,
+ struct cmd_token *token)
+{
+ struct community_list_master *cm;
+
+ cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
+
+ hash_walk(cm->hash, bgp_community_list_vector_walker, &comps);
+}
+
+static void bgp_lcommunity_list_cmd_completion(vector comps,
+ struct cmd_token *token)
+{
+ struct community_list_master *cm;
+
+ cm = community_list_master_lookup(bgp_clist,
+ LARGE_COMMUNITY_LIST_MASTER);
+
+ hash_walk(cm->hash, bgp_community_list_vector_walker, &comps);
+}
+
+static void bgp_extcommunity_list_cmd_completion(vector comps,
+ struct cmd_token *token)
+{
+ struct community_list_master *cm;
+
+ cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
+
+ hash_walk(cm->hash, bgp_community_list_vector_walker, &comps);
+}
+
+static const struct cmd_variable_handler community_list_handlers[] = {
+ {.tokenname = "COMMUNITY_LIST_NAME",
+ .completions = bgp_community_list_cmd_completion},
+ {.completions = NULL}};
+
+static const struct cmd_variable_handler lcommunity_list_handlers[] = {
+ {.tokenname = "LCOMMUNITY_LIST_NAME",
+ .completions = bgp_lcommunity_list_cmd_completion},
+ {.completions = NULL}};
+
+static const struct cmd_variable_handler extcommunity_list_handlers[] = {
+ {.tokenname = "EXTCOMMUNITY_LIST_NAME",
+ .completions = bgp_extcommunity_list_cmd_completion},
+ {.completions = NULL}};
+
+void bgp_community_list_command_completion_setup(void)
+{
+ cmd_variable_handler_register(community_list_handlers);
+ cmd_variable_handler_register(lcommunity_list_handlers);
+ cmd_variable_handler_register(extcommunity_list_handlers);
+}
diff --git a/bgpd/bgp_clist.h b/bgpd/bgp_clist.h
index 632e1730cc..bb7c1363b2 100644
--- a/bgpd/bgp_clist.h
+++ b/bgpd/bgp_clist.h
@@ -184,4 +184,6 @@ static inline uint32_t bgp_clist_hash_key(char *name)
return jhash(name, strlen(name), 0xdeadbeaf);
}
+extern void bgp_community_list_command_completion_setup(void);
+
#endif /* _QUAGGA_BGP_CLIST_H */
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 63b2fbd4e6..a031b78971 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -19910,6 +19910,8 @@ static void community_list_vty(void)
install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_expanded_cmd);
install_element(VIEW_NODE, &show_bgp_lcommunity_list_cmd);
install_element(VIEW_NODE, &show_bgp_lcommunity_list_arg_cmd);
+
+ bgp_community_list_command_completion_setup();
}
static struct cmd_node community_alias_node = {