Skip to content
Permalink
Browse files

lib: distribute-list ipv6 can be (un)configured

ipv6 distribute-list name picked up was not the correct one. the
parameter number is modified accordingly.
Also, the unconfiguration of distribute-list ipv6 was conflicting with
other daemon, thus making impossible the unconfigration. The command has
been split to be specific to ipv6 distribute-list.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
  • Loading branch information...
pguibert6WIND committed Nov 8, 2018
1 parent 2379dbe commit 96f05398a27c78bcc8acaa996ad17fbedef48cad
Showing with 47 additions and 13 deletions.
  1. +47 −13 lib/distribute.c
@@ -299,48 +299,81 @@ DEFUN (ipv6_distribute_list,
ifname = argv[argc - 1]->arg;

/* Get interface name corresponding distribute list. */
distfn(ifname, type, argv[1 + prefix]->arg);
distfn(ifname, type, argv[2 + prefix]->arg);

return CMD_SUCCESS;
}

DEFUN (no_distribute_list,
no_distribute_list_cmd,
"no [ipv6] distribute-list [prefix] WORD <in|out> [WORD]",
"no distribute-list [prefix] WORD <in|out> [WORD]",
NO_STR
"IPv6\n"
"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")
{
int ipv6 = strmatch(argv[1]->text, "ipv6");
int prefix = (argv[2 + ipv6]->type == WORD_TKN) ? 1 : 0;
int prefix = (argv[2]->type == WORD_TKN) ? 1 : 0;

int idx_alname = 2 + ipv6 + prefix;
int idx_alname = 2 + prefix;
int idx_disttype = idx_alname + 1;
enum distribute_type type =
argv[idx_disttype]->arg[0] == 'i' ?
DISTRIBUTE_V4_IN : DISTRIBUTE_V4_OUT;

/* Check of distribute list type. */
enum distribute_type distin =
(ipv6) ? DISTRIBUTE_V6_IN : DISTRIBUTE_V4_IN;
enum distribute_type distout =
(ipv6) ? DISTRIBUTE_V6_OUT : DISTRIBUTE_V4_OUT;
/* Set appropriate function call */
int (*distfn)(const char *, enum distribute_type,
const char *) =
prefix ? &distribute_list_prefix_unset : &distribute_list_unset;

/* if interface is present, get name */
const char *ifname = NULL;
if (argv[argc - 1]->type == VARIABLE_TKN)
ifname = argv[argc - 1]->arg;
/* Get interface name corresponding distribute list. */
int ret = distfn(ifname, type, argv[2 + prefix]->arg);

if (!ret) {
vty_out(vty, "distribute list doesn't exist\n");
return CMD_WARNING_CONFIG_FAILED;
}
return CMD_SUCCESS;
}

DEFUN (no_ipv6_distribute_list,
no_ipv6_distribute_list_cmd,
"no ipv6 distribute-list [prefix] WORD <in|out> [WORD]",
NO_STR
"IPv6\n"
"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")
{
int prefix = (argv[3]->type == WORD_TKN) ? 1 : 0;

int idx_alname = 3 + prefix;
int idx_disttype = idx_alname + 1;

enum distribute_type type =
argv[idx_disttype]->arg[0] == 'i' ? distin : distout;
argv[idx_disttype]->arg[0] == 'i' ?
DISTRIBUTE_V6_IN : DISTRIBUTE_V6_OUT;

/* Set appropriate function call */
int (*distfn)(const char *, enum distribute_type, const char *) =
prefix ? &distribute_list_prefix_unset : &distribute_list_unset;

/* if interface is present, get name */
const char *ifname = NULL;

if (argv[argc - 1]->type == VARIABLE_TKN)
ifname = argv[argc - 1]->arg;
/* Get interface name corresponding distribute list. */
int ret = distfn(ifname, type, argv[2 + prefix]->arg);
int ret = distfn(ifname, type, argv[3 + prefix]->arg);

if (!ret) {
vty_out(vty, "distribute list doesn't exist\n");
@@ -535,6 +568,7 @@ void distribute_list_init(int node)
/* install v6 */
if (node == RIPNG_NODE) {
install_element(RIPNG_NODE, &ipv6_distribute_list_cmd);
install_element(RIPNG_NODE, &no_ipv6_distribute_list_cmd);
}

/* TODO: install v4 syntax command for v6 only protocols. */

0 comments on commit 96f0539

Please sign in to comment.
You can’t perform that action at this time.