diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-22 23:44:17 +0200 | 
|---|---|---|
| committer | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-22 23:59:30 +0200 | 
| commit | 83a698d891aa1e11dec5c99a16a1bd1cc2ee391f (patch) | |
| tree | b32ab142420f9ad3b7cf530b67233dbde01763af /ripngd | |
| parent | 45b868a2af8b0862ef0a2b502ec0cce641266f7c (diff) | |
ripngd: use correct autocompletion for distribute-list commands
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>
Diffstat (limited to 'ripngd')
| -rw-r--r-- | ripngd/ripng_cli.c | 75 | 
1 files changed, 67 insertions, 8 deletions
diff --git a/ripngd/ripng_cli.c b/ripngd/ripng_cli.c index 3212229ac6..aa9f3cc037 100644 --- a/ripngd/ripng_cli.c +++ b/ripngd/ripng_cli.c @@ -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);  | 
