ripngd: use new distribute-list northbound code.

Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
Christian Hopps 2024-01-21 21:19:28 +00:00
parent 8f7a9355f2
commit cc9f4029cb
6 changed files with 120 additions and 43 deletions

View file

@ -516,49 +516,59 @@ DEFPY_YANG (clear_ipv6_rip,
return ret; return ret;
} }
DEFUN (ripng_ipv6_distribute_list, DEFPY_YANG(
ripng_ipv6_distribute_list_cmd, ripng_ipv6_distribute_list, ripng_ipv6_distribute_list_cmd,
"ipv6 distribute-list [prefix] ACCESSLIST6_NAME <in|out> [WORD]", "ipv6 distribute-list [prefix]$prefix ACCESSLIST4_NAME$name <in|out>$dir [WORD$ifname]",
"IPv6\n" "Filter networks in routing updates\n"
"Filter networks in routing updates\n" "Specify a prefix list\n"
"Specify a prefix\n" "access-list or prefix-list name\n"
"Access-list name\n" "Filter incoming routing updates\n"
"Filter incoming routing updates\n" "Filter outgoing routing updates\n"
"Filter outgoing routing updates\n" "Interface name\n")
"Interface name\n")
{ {
const char *ifname = NULL; char xpath[XPATH_MAXLEN];
int prefix = (argv[2]->type == WORD_TKN) ? 1 : 0;
if (argv[argc - 1]->type == VARIABLE_TKN) snprintf(xpath, sizeof(xpath),
ifname = argv[argc - 1]->arg; "./distribute-list[interface='%s']/%s/%s-list",
ifname ? ifname : "", dir, prefix ? "prefix" : "access");
return distribute_list_parser(NULL, prefix, false, /* nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); */
argv[3 + prefix]->text, nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, name);
argv[2 + prefix]->arg, ifname); return nb_cli_apply_changes(vty, NULL);
} }
DEFUN (ripng_no_ipv6_distribute_list, DEFPY_YANG(no_ripng_ipv6_distribute_list,
ripng_no_ipv6_distribute_list_cmd, no_ripng_ipv6_distribute_list_cmd,
"no ipv6 distribute-list [prefix] ACCESSLIST6_NAME <in|out> [WORD]", "no ipv6 distribute-list [prefix]$prefix [ACCESSLIST4_NAME$name] <in|out>$dir [WORD$ifname]",
NO_STR NO_STR
"IPv6\n" "Filter networks in routing updates\n"
"Filter networks in routing updates\n" "Specify a prefix list\n"
"Specify a prefix\n" "access-list or prefix-list name\n"
"Access-list name\n" "Filter incoming routing updates\n"
"Filter incoming routing updates\n" "Filter outgoing routing updates\n"
"Filter outgoing routing updates\n" "Interface name\n")
"Interface name\n")
{ {
const char *ifname = NULL; const struct lyd_node *value_node;
int prefix = (argv[3]->type == WORD_TKN) ? 1 : 0; char xpath[XPATH_MAXLEN];
if (argv[argc - 1]->type == VARIABLE_TKN) snprintf(xpath, sizeof(xpath),
ifname = argv[argc - 1]->arg; "./distribute-list[interface='%s']/%s/%s-list",
ifname ? ifname : "", dir, prefix ? "prefix" : "access");
return distribute_list_no_parser(NULL, vty, prefix, false, /*
argv[4 + prefix]->text, * See if the user has specified specific list so check it exists.
argv[3 + prefix]->arg, ifname); *
* 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);
} }
void ripng_cli_init(void) void ripng_cli_init(void)
@ -567,7 +577,7 @@ void ripng_cli_init(void)
install_element(CONFIG_NODE, &no_router_ripng_cmd); 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_cmd);
install_element(RIPNG_NODE, &ripng_no_ipv6_distribute_list_cmd); install_element(RIPNG_NODE, &no_ripng_ipv6_distribute_list_cmd);
install_element(RIPNG_NODE, &ripng_allow_ecmp_cmd); install_element(RIPNG_NODE, &ripng_allow_ecmp_cmd);
install_element(RIPNG_NODE, &no_ripng_allow_ecmp_cmd); install_element(RIPNG_NODE, &no_ripng_allow_ecmp_cmd);

View file

@ -6,11 +6,12 @@
#include <zebra.h> #include <zebra.h>
#include "northbound.h" #include "distribute.h"
#include "if_rmap.h"
#include "libfrr.h" #include "libfrr.h"
#include "northbound.h"
#include "ripngd/ripng_nb.h" #include "ripngd/ripng_nb.h"
#include "lib/if_rmap.h"
/* clang-format off */ /* clang-format off */
const struct frr_yang_module_info frr_ripngd_info = { const struct frr_yang_module_info frr_ripngd_info = {
@ -92,6 +93,45 @@ const struct frr_yang_module_info frr_ripngd_info = {
.destroy = ripngd_instance_passive_interface_destroy, .destroy = ripngd_instance_passive_interface_destroy,
}, },
}, },
{
.xpath = "/frr-ripngd:ripngd/instance/distribute-list",
.cbs = {
.create = ripngd_instance_distribute_list_create,
.destroy = group_distribute_list_destroy,
}
},
{
.xpath = "/frr-ripngd:ripngd/instance/distribute-list/in/access-list",
.cbs = {
.modify = group_distribute_list_ipv6_modify,
.destroy = group_distribute_list_ipv6_destroy,
.cli_show = group_distribute_list_ipv6_cli_show,
}
},
{
.xpath = "/frr-ripngd:ripngd/instance/distribute-list/out/access-list",
.cbs = {
.modify = group_distribute_list_ipv6_modify,
.destroy = group_distribute_list_ipv6_destroy,
.cli_show = group_distribute_list_ipv6_cli_show,
}
},
{
.xpath = "/frr-ripngd:ripngd/instance/distribute-list/in/prefix-list",
.cbs = {
.modify = group_distribute_list_ipv6_modify,
.destroy = group_distribute_list_ipv6_destroy,
.cli_show = group_distribute_list_ipv6_cli_show,
}
},
{
.xpath = "/frr-ripngd:ripngd/instance/distribute-list/out/prefix-list",
.cbs = {
.modify = group_distribute_list_ipv6_modify,
.destroy = group_distribute_list_ipv6_destroy,
.cli_show = group_distribute_list_ipv6_cli_show,
}
},
{ {
.xpath = "/frr-ripngd:ripngd/instance/redistribute", .xpath = "/frr-ripngd:ripngd/instance/redistribute",
.cbs = { .cbs = {

View file

@ -7,6 +7,8 @@
#ifndef _FRR_RIPNG_NB_H_ #ifndef _FRR_RIPNG_NB_H_
#define _FRR_RIPNG_NB_H_ #define _FRR_RIPNG_NB_H_
#include "northbound.h"
extern const struct frr_yang_module_info frr_ripngd_info; extern const struct frr_yang_module_info frr_ripngd_info;
/* Mandatory callbacks. */ /* Mandatory callbacks. */
@ -30,6 +32,8 @@ int ripngd_instance_offset_list_access_list_modify(
int ripngd_instance_offset_list_metric_modify(struct nb_cb_modify_args *args); int ripngd_instance_offset_list_metric_modify(struct nb_cb_modify_args *args);
int ripngd_instance_passive_interface_create(struct nb_cb_create_args *args); int ripngd_instance_passive_interface_create(struct nb_cb_create_args *args);
int ripngd_instance_passive_interface_destroy(struct nb_cb_destroy_args *args); int ripngd_instance_passive_interface_destroy(struct nb_cb_destroy_args *args);
int ripngd_instance_distribute_list_create(struct nb_cb_create_args *args);
int ripngd_instance_distribute_list_destroy(struct nb_cb_destroy_args *args);
int ripngd_instance_redistribute_create(struct nb_cb_create_args *args); int ripngd_instance_redistribute_create(struct nb_cb_create_args *args);
int ripngd_instance_redistribute_destroy(struct nb_cb_destroy_args *args); int ripngd_instance_redistribute_destroy(struct nb_cb_destroy_args *args);
int ripngd_instance_redistribute_route_map_modify( int ripngd_instance_redistribute_route_map_modify(

View file

@ -368,6 +368,22 @@ int ripngd_instance_passive_interface_destroy(struct nb_cb_destroy_args *args)
return ripng_passive_interface_unset(ripng, ifname); return ripng_passive_interface_unset(ripng, ifname);
} }
/*
* XPath: /frr-ripng:ripng/instance/distribute-list
*/
int ripngd_instance_distribute_list_create(struct nb_cb_create_args *args)
{
struct ripng *ripng;
if (args->event != NB_EV_APPLY)
return NB_OK;
ripng = nb_running_get_entry(args->dnode, NULL, true);
group_distribute_list_create_helper(args, ripng->distribute_ctx);
return NB_OK;
}
/* /*
* XPath: /frr-ripngd:ripngd/instance/redistribute * XPath: /frr-ripngd:ripngd/instance/redistribute
*/ */

View file

@ -2286,8 +2286,6 @@ static int ripng_config_write(struct vty *vty)
nb_cli_show_dnode_cmds(vty, dnode, false); nb_cli_show_dnode_cmds(vty, dnode, false);
config_write_distribute(vty, ripng->distribute_ctx);
vty_out(vty, "exit\n"); vty_out(vty, "exit\n");
write = 1; write = 1;

View file

@ -13,6 +13,9 @@ module frr-ripngd {
import frr-if-rmap { import frr-if-rmap {
prefix frr-if-rmap; prefix frr-if-rmap;
} }
import frr-filter {
prefix frr-filter;
}
import frr-interface { import frr-interface {
prefix frr-interface; prefix frr-interface;
} }
@ -63,6 +66,7 @@ module frr-ripngd {
description description
"Changed interface references to use "Changed interface references to use
frr-interface:interface-ref typedef"; frr-interface:interface-ref typedef";
reference "FRRouting";
} }
revision 2018-11-27 { revision 2018-11-27 {
description description
@ -72,6 +76,7 @@ module frr-ripngd {
} }
container ripngd { container ripngd {
description "ripng routing instance data";
/* /*
* Routing instance configuration. * Routing instance configuration.
*/ */
@ -169,15 +174,18 @@ module frr-ripngd {
"A list of interfaces where the sending of RIPng packets "A list of interfaces where the sending of RIPng packets
is disabled."; is disabled.";
} }
uses frr-filter:distribute-list-group;
list redistribute { list redistribute {
key "protocol"; key "protocol";
description description
"Redistributes routes learned from other routing protocols."; "Redistributes routes learned from other routing protocols.";
leaf protocol { leaf protocol {
type frr-route-types:frr-route-types-v6; type frr-route-types:frr-route-types-v6;
must '. != "ripng"';
description description
"Routing protocol."; "Routing protocol.";
must '. != "ripng"';
} }
leaf route-map { leaf route-map {
type frr-route-map:route-map-ref; type frr-route-map:route-map-ref;
@ -330,6 +338,7 @@ module frr-ripngd {
* Per-interface configuration data * Per-interface configuration data
*/ */
augment "/frr-interface:lib/frr-interface:interface" { augment "/frr-interface:lib/frr-interface:interface" {
description "RIPng interface augmentation.";
container ripng { container ripng {
description description
"RIPng interface parameters."; "RIPng interface parameters.";