diff options
| author | Christian Hopps <chopps@labn.net> | 2024-01-21 14:01:58 +0000 | 
|---|---|---|
| committer | Christian Hopps <chopps@labn.net> | 2024-01-22 11:33:33 +0000 | 
| commit | 8f7a9355f216adbfb4c2727432e394b5bc8d5703 (patch) | |
| tree | fa3d823203e6bb056158930af4307d31a1b9eea3 /ripd | |
| parent | a993b8e9bb71407e4adb478e8a57f35fdf85febd (diff) | |
ripd: use new distribute-list northbound code.
Signed-off-by: Christian Hopps <chopps@labn.net>
Diffstat (limited to 'ripd')
| -rw-r--r-- | ripd/rip_cli.c | 85 | ||||
| -rw-r--r-- | ripd/rip_nb.c | 44 | ||||
| -rw-r--r-- | ripd/rip_nb.h | 4 | ||||
| -rw-r--r-- | ripd/rip_nb_config.c | 17 | ||||
| -rw-r--r-- | ripd/ripd.c | 3 | 
5 files changed, 112 insertions, 41 deletions
diff --git a/ripd/rip_cli.c b/ripd/rip_cli.c index a4d306a4d2..d4366d0186 100644 --- a/ripd/rip_cli.c +++ b/ripd/rip_cli.c @@ -1128,46 +1128,59 @@ DEFPY_YANG (clear_ip_rip,  	return ret;  } -DEFUN (rip_distribute_list, -       rip_distribute_list_cmd, -       "distribute-list [prefix] ACCESSLIST4_NAME <in|out> [WORD]", -       "Filter networks in routing updates\n" -       "Specify a prefix\n" -       "Access-list name\n" -       "Filter incoming routing updates\n" -       "Filter outgoing routing updates\n" -       "Interface name\n") +DEFPY_YANG( +	rip_distribute_list, rip_distribute_list_cmd, +	"distribute-list [prefix]$prefix ACCESSLIST4_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" +	"Filter incoming routing updates\n" +	"Filter outgoing routing updates\n" +	"Interface name\n")  { -	const char *ifname = NULL; -	int prefix = (argv[1]->type == WORD_TKN) ? 1 : 0; - -	if (argv[argc - 1]->type == VARIABLE_TKN) -		ifname = argv[argc - 1]->arg; +	char xpath[XPATH_MAXLEN]; -	return distribute_list_parser(NULL, prefix, true, argv[2 + prefix]->text, -				      argv[1 + prefix]->arg, ifname); +	snprintf(xpath, sizeof(xpath), +		 "./distribute-list[interface='%s']/%s/%s-list", +		 ifname ? ifname : "", dir, prefix ? "prefix" : "access"); +	/* 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);  } -DEFUN (rip_no_distribute_list, -       rip_no_distribute_list_cmd, -       "no distribute-list [prefix] ACCESSLIST4_NAME <in|out> [WORD]", -       NO_STR -       "Filter networks in routing updates\n" -       "Specify a prefix\n" -       "Access-list name\n" -       "Filter incoming routing updates\n" -       "Filter outgoing routing updates\n" -       "Interface name\n") -{ -	const char *ifname = NULL; -	int prefix = (argv[2]->type == WORD_TKN) ? 1 : 0; - -	if (argv[argc - 1]->type == VARIABLE_TKN) -		ifname = argv[argc - 1]->arg; +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_STR +	   "Filter networks in routing updates\n" +	   "Specify a prefix list\n" +	   "access-list or prefix-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]; -	return distribute_list_no_parser(NULL, vty, prefix, true, -					 argv[3 + prefix]->text, -					 argv[2 + prefix]->arg, ifname); +	snprintf(xpath, sizeof(xpath), +		 "./distribute-list[interface='%s']/%s/%s-list", +		 ifname ? ifname : "", dir, prefix ? "prefix" : "access"); +	/* +	 * 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);  }  void rip_cli_init(void) @@ -1176,7 +1189,7 @@ 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_no_distribute_list_cmd); +	install_element(RIP_NODE, &no_rip_distribute_list_cmd);  	install_element(RIP_NODE, &rip_allow_ecmp_cmd);  	install_element(RIP_NODE, &no_rip_allow_ecmp_cmd); diff --git a/ripd/rip_nb.c b/ripd/rip_nb.c index d11f1e1d34..7167be124a 100644 --- a/ripd/rip_nb.c +++ b/ripd/rip_nb.c @@ -6,11 +6,12 @@  #include <zebra.h> -#include "northbound.h" +#include "distribute.h" +#include "if_rmap.h"  #include "libfrr.h" +#include "northbound.h"  #include "ripd/rip_nb.h" -#include "lib/if_rmap.h"  /* clang-format off */  const struct frr_yang_module_info frr_ripd_info = { @@ -144,6 +145,45 @@ const struct frr_yang_module_info frr_ripd_info = {  			},  		},  		{ +			.xpath = "/frr-ripd:ripd/instance/distribute-list", +			.cbs = { +				.create = ripd_instance_distribute_list_create, +				.destroy = group_distribute_list_destroy, +			} +		}, +		{ +			.xpath = "/frr-ripd:ripd/instance/distribute-list/in/access-list", +			.cbs = { +				.modify = group_distribute_list_ipv4_modify, +				.destroy = group_distribute_list_ipv4_destroy, +				.cli_show = group_distribute_list_ipv4_cli_show, +			} +		}, +		{ +			.xpath = "/frr-ripd:ripd/instance/distribute-list/out/access-list", +			.cbs = { +				.modify = group_distribute_list_ipv4_modify, +				.destroy = group_distribute_list_ipv4_destroy, +				.cli_show = group_distribute_list_ipv4_cli_show, +			} +		}, +		{ +			.xpath = "/frr-ripd:ripd/instance/distribute-list/in/prefix-list", +			.cbs = { +				.modify = group_distribute_list_ipv4_modify, +				.destroy = group_distribute_list_ipv4_destroy, +				.cli_show = group_distribute_list_ipv4_cli_show, +			} +		}, +		{ +			.xpath = "/frr-ripd:ripd/instance/distribute-list/out/prefix-list", +			.cbs = { +				.modify = group_distribute_list_ipv4_modify, +				.destroy = group_distribute_list_ipv4_destroy, +				.cli_show = group_distribute_list_ipv4_cli_show, +			} +		}, +		{  			.xpath = "/frr-ripd:ripd/instance/redistribute",  			.cbs = {  				.apply_finish = ripd_instance_redistribute_apply_finish, diff --git a/ripd/rip_nb.h b/ripd/rip_nb.h index 9929e0952b..811fee55ec 100644 --- a/ripd/rip_nb.h +++ b/ripd/rip_nb.h @@ -7,6 +7,8 @@  #ifndef _FRR_RIP_NB_H_  #define _FRR_RIP_NB_H_ +#include "northbound.h" +  extern const struct frr_yang_module_info frr_ripd_info;  /* Mandatory callbacks. */ @@ -45,6 +47,8 @@ int ripd_instance_passive_interface_destroy(struct nb_cb_destroy_args *args);  int ripd_instance_non_passive_interface_create(struct nb_cb_create_args *args);  int ripd_instance_non_passive_interface_destroy(  	struct nb_cb_destroy_args *args); +int ripd_instance_distribute_list_create(struct nb_cb_create_args *args); +int ripd_instance_distribute_list_destroy(struct nb_cb_destroy_args *args);  int ripd_instance_redistribute_create(struct nb_cb_create_args *args);  int ripd_instance_redistribute_destroy(struct nb_cb_destroy_args *args);  int ripd_instance_redistribute_route_map_modify(struct nb_cb_modify_args *args); diff --git a/ripd/rip_nb_config.c b/ripd/rip_nb_config.c index 8b9cc922ad..fb7533789b 100644 --- a/ripd/rip_nb_config.c +++ b/ripd/rip_nb_config.c @@ -548,6 +548,23 @@ int ripd_instance_non_passive_interface_destroy(struct nb_cb_destroy_args *args)  	return rip_passive_nondefault_unset(rip, ifname);  } + +/* + * XPath: /frr-ripd:ripd/instance/distribute-list + */ +int ripd_instance_distribute_list_create(struct nb_cb_create_args *args) +{ +	struct rip *rip; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	rip = nb_running_get_entry(args->dnode, NULL, true); +	group_distribute_list_create_helper(args, rip->distribute_ctx); + +	return NB_OK; +} +  /*   * XPath: /frr-ripd:ripd/instance/redistribute   */ diff --git a/ripd/ripd.c b/ripd/ripd.c index d5df16c3a9..a744e081d1 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -3271,9 +3271,6 @@ static int config_write_rip(struct vty *vty)  		nb_cli_show_dnode_cmds(vty, dnode, false); -		/* Distribute configuration. */ -		config_write_distribute(vty, rip->distribute_ctx); -  		vty_out(vty, "exit\n");  		write = 1;  | 
