Implemented `show route where <condition>' command.
Pavel, please check my addition to filter/config.Y.
This commit is contained in:
parent
f2c6c80a24
commit
430da60fa2
3 changed files with 32 additions and 3 deletions
1
TODO
1
TODO
|
@ -50,7 +50,6 @@ shutdown # order system shutdown
|
||||||
configure [<file>]
|
configure [<file>]
|
||||||
debug <what> # dump debugging information to log
|
debug <what> # dump debugging information to log
|
||||||
show <name> # show everything you know about symbol <name>
|
show <name> # show everything you know about symbol <name>
|
||||||
route [<route>] [table <name>] [filter (<name> | { <inline> })] [where <condition>] [all] <-- WHERE
|
|
||||||
rip ??? [<name>]
|
rip ??? [<name>]
|
||||||
ospf ??? [<name>]
|
ospf ??? [<name>]
|
||||||
static ??? [<name>]
|
static ??? [<name>]
|
||||||
|
|
|
@ -34,13 +34,13 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, CONST, UNSET,
|
||||||
LEN,
|
LEN,
|
||||||
DEFINED,
|
DEFINED,
|
||||||
IMPOSSIBLE,
|
IMPOSSIBLE,
|
||||||
FILTER)
|
FILTER, WHERE)
|
||||||
|
|
||||||
%nonassoc THEN
|
%nonassoc THEN
|
||||||
%nonassoc ELSE
|
%nonassoc ELSE
|
||||||
|
|
||||||
%type <x> term block cmds cmd function_body constant print_one print_list var_list var_listn any_dynamic
|
%type <x> term block cmds cmd function_body constant print_one print_list var_list var_listn any_dynamic
|
||||||
%type <f> filter filter_body
|
%type <f> filter filter_body where_filter
|
||||||
%type <i> type break_command pair
|
%type <i> type break_command pair
|
||||||
%type <e> set_item set_items switch_body
|
%type <e> set_item set_items switch_body
|
||||||
%type <v> set_atom prefix prefix_s ipa
|
%type <v> set_atom prefix prefix_s ipa
|
||||||
|
@ -124,6 +124,30 @@ filter:
|
||||||
| filter_body
|
| filter_body
|
||||||
;
|
;
|
||||||
|
|
||||||
|
where_filter:
|
||||||
|
WHERE term {
|
||||||
|
/* Construct 'IF term THEN ACCEPT; REJECT;' */
|
||||||
|
struct filter *f = cfg_alloc(sizeof(struct filter));
|
||||||
|
struct f_inst *i, *acc, *rej;
|
||||||
|
acc = f_new_inst(); /* ACCEPT */
|
||||||
|
acc->code = 'p,';
|
||||||
|
acc->a1.p = NULL;
|
||||||
|
acc->a2.i = F_ACCEPT;
|
||||||
|
rej = f_new_inst(); /* REJECT */
|
||||||
|
rej->code = 'p,';
|
||||||
|
rej->a1.p = NULL;
|
||||||
|
rej->a2.i = F_REJECT;
|
||||||
|
i = f_new_inst(); /* IF */
|
||||||
|
i->code = '?';
|
||||||
|
i->a1.p = $2;
|
||||||
|
i->a2.p = acc;
|
||||||
|
i->next = rej;
|
||||||
|
f->name = NULL;
|
||||||
|
f->root = i;
|
||||||
|
$$ = f;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
function_params:
|
function_params:
|
||||||
'(' declsn ')' { printf( "Have function parameters\n" ); $$=$2; }
|
'(' declsn ')' { printf( "Have function parameters\n" ); $$=$2; }
|
||||||
| '(' ')' { $$=NULL; }
|
| '(' ')' { $$=NULL; }
|
||||||
|
|
|
@ -237,8 +237,14 @@ r_args:
|
||||||
}
|
}
|
||||||
| r_args FILTER filter {
|
| r_args FILTER filter {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
|
if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice");
|
||||||
$$->filter = $3;
|
$$->filter = $3;
|
||||||
}
|
}
|
||||||
|
| r_args where_filter {
|
||||||
|
$$ = $1;
|
||||||
|
if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice");
|
||||||
|
$$->filter = $2;
|
||||||
|
}
|
||||||
| r_args ALL {
|
| r_args ALL {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
$$->verbose = 1;
|
$$->verbose = 1;
|
||||||
|
|
Loading…
Reference in a new issue