]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Auto-complete for community lists
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Tue, 10 Aug 2021 07:23:52 +0000 (10:23 +0300)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Tue, 10 Aug 2021 07:56:26 +0000 (10:56 +0300)
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
bgpd/bgp_clist.c
bgpd/bgp_clist.h
bgpd/bgp_vty.c

index 50122ad7da6cb3edac230e53c699993fb05bb14e..1fb55ddf7d3fcf6c1c24f98f298d11c236f02d8c 100644 (file)
@@ -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);
+}
index 632e1730cc6c3739e21878253190c0322e0a23e6..bb7c1363b2c4726a45429172d7a864e4e3c56143 100644 (file)
@@ -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 */
index 63b2fbd4e618b31d7025f8997f0a8858b8bab3a3..a031b78971816435ff2b02794f320962ff4f7b4e 100644 (file)
@@ -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 = {