diff options
Diffstat (limited to 'ripd/rip_cli.c')
-rw-r--r-- | ripd/rip_cli.c | 71 |
1 files changed, 63 insertions, 8 deletions
diff --git a/ripd/rip_cli.c b/ripd/rip_cli.c index d4366d018..daa83dd05 100644 --- a/ripd/rip_cli.c +++ b/ripd/rip_cli.c @@ -1130,10 +1130,29 @@ DEFPY_YANG (clear_ip_rip, DEFPY_YANG( rip_distribute_list, rip_distribute_list_cmd, - "distribute-list [prefix]$prefix ACCESSLIST4_NAME$name <in|out>$dir [WORD$ifname]", + "distribute-list ACCESSLIST4_NAME$name <in|out>$dir [WORD$ifname]", + "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( + rip_distribute_list_prefix, rip_distribute_list_prefix_cmd, + "distribute-list prefix PREFIXLIST4_NAME$name <in|out>$dir [WORD$ifname]", "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") @@ -1141,8 +1160,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); @@ -1150,11 +1169,45 @@ DEFPY_YANG( DEFPY_YANG(no_rip_distribute_list, no_rip_distribute_list_cmd, - "no distribute-list [prefix]$prefix [ACCESSLIST4_NAME$name] <in|out>$dir [WORD$ifname]", + "no distribute-list [ACCESSLIST4_NAME$name] <in|out>$dir [WORD$ifname]", + NO_STR + "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_rip_distribute_list_prefix, + no_rip_distribute_list_prefix_cmd, + "no distribute-list prefix [PREFIXLIST4_NAME$name] <in|out>$dir [WORD$ifname]", NO_STR "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") @@ -1163,8 +1216,8 @@ DEFPY_YANG(no_rip_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. * @@ -1189,7 +1242,9 @@ void rip_cli_init(void) install_element(CONFIG_NODE, &no_router_rip_cmd); install_element(RIP_NODE, &rip_distribute_list_cmd); + install_element(RIP_NODE, &rip_distribute_list_prefix_cmd); install_element(RIP_NODE, &no_rip_distribute_list_cmd); + install_element(RIP_NODE, &no_rip_distribute_list_prefix_cmd); install_element(RIP_NODE, &rip_allow_ecmp_cmd); install_element(RIP_NODE, &no_rip_allow_ecmp_cmd); |