]> git.puffer.fish Git - mirror/frr.git/commitdiff
ripngd: use correct autocompletion for distribute-list commands 15194/head
authorIgor Ryzhov <iryzhov@nfware.com>
Mon, 22 Jan 2024 21:44:17 +0000 (23:44 +0200)
committerIgor Ryzhov <iryzhov@nfware.com>
Mon, 22 Jan 2024 21:59:30 +0000 (23:59 +0200)
Currently, we always use access-list autocompletion, even if configuring
prefix-lists. We should differentiate. Also, fix missing "IPv6"
docstring and use correct address family.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
ripngd/ripng_cli.c

index 3212229ac6a6a527941ae2d94391c82f057feb65..aa9f3cc0375b69a4fc5b90bc6e19233ed176696a 100644 (file)
@@ -518,10 +518,31 @@ DEFPY_YANG (clear_ipv6_rip,
 
 DEFPY_YANG(
        ripng_ipv6_distribute_list, ripng_ipv6_distribute_list_cmd,
-       "ipv6 distribute-list [prefix]$prefix ACCESSLIST4_NAME$name <in|out>$dir [WORD$ifname]",
+       "ipv6 distribute-list ACCESSLIST6_NAME$name <in|out>$dir [WORD$ifname]",
+       "IPv6\n"
+       "Filter networks in routing updates\n"
+       "Access-list name\n"
+       "Filter incoming routing updates\n"
+       "Filter outgoing routing updates\n"
+       "Interface name\n")
+{
+       char xpath[XPATH_MAXLEN];
+
+       snprintf(xpath, sizeof(xpath),
+                "./distribute-list[interface='%s']/%s/access-list",
+                ifname ? ifname : "", dir);
+       /* nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); */
+       nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, name);
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY_YANG(
+       ripng_ipv6_distribute_list_prefix, ripng_ipv6_distribute_list_prefix_cmd,
+       "ipv6 distribute-list prefix PREFIXLIST6_NAME$name <in|out>$dir [WORD$ifname]",
+       "IPv6\n"
        "Filter networks in routing updates\n"
        "Specify a prefix list\n"
-       "access-list or prefix-list name\n"
+       "Prefix-list name\n"
        "Filter incoming routing updates\n"
        "Filter outgoing routing updates\n"
        "Interface name\n")
@@ -529,8 +550,8 @@ DEFPY_YANG(
        char xpath[XPATH_MAXLEN];
 
        snprintf(xpath, sizeof(xpath),
-                "./distribute-list[interface='%s']/%s/%s-list",
-                ifname ? ifname : "", dir, prefix ? "prefix" : "access");
+                "./distribute-list[interface='%s']/%s/prefix-list",
+                ifname ? ifname : "", dir);
        /* nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); */
        nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, name);
        return nb_cli_apply_changes(vty, NULL);
@@ -538,11 +559,47 @@ DEFPY_YANG(
 
 DEFPY_YANG(no_ripng_ipv6_distribute_list,
           no_ripng_ipv6_distribute_list_cmd,
-          "no ipv6 distribute-list [prefix]$prefix [ACCESSLIST4_NAME$name] <in|out>$dir [WORD$ifname]",
+          "no ipv6 distribute-list [ACCESSLIST6_NAME$name] <in|out>$dir [WORD$ifname]",
+          NO_STR
+          "IPv6\n"
+          "Filter networks in routing updates\n"
+          "Access-list name\n"
+          "Filter incoming routing updates\n"
+          "Filter outgoing routing updates\n"
+          "Interface name\n")
+{
+       const struct lyd_node *value_node;
+       char xpath[XPATH_MAXLEN];
+
+       snprintf(xpath, sizeof(xpath),
+                "./distribute-list[interface='%s']/%s/access-list",
+                ifname ? ifname : "", dir);
+       /*
+        * See if the user has specified specific list so check it exists.
+        *
+        * NOTE: Other FRR CLI commands do not do this sort of verification and
+        * there may be an official decision not to.
+        */
+       if (name) {
+               value_node = yang_dnode_getf(vty->candidate_config->dnode, "%s/%s",
+                                            VTY_CURR_XPATH, xpath);
+               if (!value_node || strcmp(name, lyd_get_value(value_node))) {
+                       vty_out(vty, "distribute list doesn't exist\n");
+                       return CMD_WARNING_CONFIG_FAILED;
+               }
+       }
+       nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY_YANG(no_ripng_ipv6_distribute_list_prefix,
+          no_ripng_ipv6_distribute_list_prefix_cmd,
+          "no ipv6 distribute-list prefix [PREFIXLIST6_NAME$name] <in|out>$dir [WORD$ifname]",
           NO_STR
+          "IPv6\n"
           "Filter networks in routing updates\n"
           "Specify a prefix list\n"
-          "access-list or prefix-list name\n"
+          "Prefix-list name\n"
           "Filter incoming routing updates\n"
           "Filter outgoing routing updates\n"
           "Interface name\n")
@@ -551,8 +608,8 @@ DEFPY_YANG(no_ripng_ipv6_distribute_list,
        char xpath[XPATH_MAXLEN];
 
        snprintf(xpath, sizeof(xpath),
-                "./distribute-list[interface='%s']/%s/%s-list",
-                ifname ? ifname : "", dir, prefix ? "prefix" : "access");
+                "./distribute-list[interface='%s']/%s/prefix-list",
+                ifname ? ifname : "", dir);
        /*
         * See if the user has specified specific list so check it exists.
         *
@@ -577,7 +634,9 @@ void ripng_cli_init(void)
        install_element(CONFIG_NODE, &no_router_ripng_cmd);
 
        install_element(RIPNG_NODE, &ripng_ipv6_distribute_list_cmd);
+       install_element(RIPNG_NODE, &ripng_ipv6_distribute_list_prefix_cmd);
        install_element(RIPNG_NODE, &no_ripng_ipv6_distribute_list_cmd);
+       install_element(RIPNG_NODE, &no_ripng_ipv6_distribute_list_prefix_cmd);
 
        install_element(RIPNG_NODE, &ripng_allow_ecmp_cmd);
        install_element(RIPNG_NODE, &no_ripng_allow_ecmp_cmd);