diff options
| -rw-r--r-- | bgpd/bgp_clist.c | 64 | ||||
| -rw-r--r-- | bgpd/bgp_clist.h | 2 | ||||
| -rw-r--r-- | bgpd/bgp_vty.c | 2 | 
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 = {  | 
