mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-03 07:31:54 +00:00
Merge commit '407eb388b7082b52921e93476c8ff1a98fe3b873' into thread-next
This commit is contained in:
commit
fc3f07fdc3
@ -106,6 +106,10 @@ f_new_var(struct sym_scope *s)
|
|||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Macro for top-level pre-defined variables. */
|
||||||
|
#define f_predefined_variable(conf_, name_, type_) \
|
||||||
|
cf_define_symbol(conf_, cf_get_symbol(conf_, name_), SYM_VARIABLE | type_, offset, f_new_var(conf_->current_scope))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets and their items are during parsing handled as lists, linked
|
* Sets and their items are during parsing handled as lists, linked
|
||||||
* through left ptr. The first item in a list also contains a pointer
|
* through left ptr. The first item in a list also contains a pointer
|
||||||
|
@ -76,6 +76,9 @@ struct filter_state {
|
|||||||
/* The route we are processing. This may be NULL to indicate no route available. */
|
/* The route we are processing. This may be NULL to indicate no route available. */
|
||||||
struct rte *rte;
|
struct rte *rte;
|
||||||
|
|
||||||
|
/* Additional external values provided to the filter */
|
||||||
|
const struct f_val *val;
|
||||||
|
|
||||||
/* Buffer for log output */
|
/* Buffer for log output */
|
||||||
log_buffer buf;
|
log_buffer buf;
|
||||||
|
|
||||||
@ -109,18 +112,20 @@ static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS;
|
|||||||
* TWOARGS macro to get both of them evaluated.
|
* TWOARGS macro to get both of them evaluated.
|
||||||
*/
|
*/
|
||||||
static enum filter_return
|
static enum filter_return
|
||||||
interpret(struct filter_state *fs, const struct f_line *line, struct f_val *val)
|
interpret(struct filter_state *fs, const struct f_line *line, uint argc, const struct f_val *argv, struct f_val *val)
|
||||||
{
|
{
|
||||||
/* No arguments allowed */
|
/* Check of appropriate number of arguments */
|
||||||
ASSERT(line->args == 0);
|
ASSERT(line->args == argc);
|
||||||
|
|
||||||
/* Initialize the filter stack */
|
/* Initialize the filter stack */
|
||||||
struct filter_stack *fstk = &fs->stack;
|
struct filter_stack *fstk = &fs->stack;
|
||||||
|
|
||||||
fstk->vcnt = line->vars;
|
/* Set the arguments and top-level variables */
|
||||||
memset(fstk->vstk, 0, sizeof(struct f_val) * line->vars);
|
fstk->vcnt = line->vars + line->args;
|
||||||
|
memcpy(fstk->vstk, argv, sizeof(struct f_val) * line->args);
|
||||||
|
memset(fstk->vstk + argc, 0, sizeof(struct f_val) * line->vars);
|
||||||
|
|
||||||
/* The same as with the value stack. Not resetting the stack for performance reasons. */
|
/* The same as with the value stack. Not resetting the stack completely for performance reasons. */
|
||||||
fstk->ecnt = 1;
|
fstk->ecnt = 1;
|
||||||
fstk->estk[0] = (struct filter_exec_stack) {
|
fstk->estk[0] = (struct filter_exec_stack) {
|
||||||
.line = line,
|
.line = line,
|
||||||
@ -210,6 +215,12 @@ f_run(const struct filter *filter, struct rte *rte, int flags)
|
|||||||
if (filter == FILTER_REJECT)
|
if (filter == FILTER_REJECT)
|
||||||
return F_REJECT;
|
return F_REJECT;
|
||||||
|
|
||||||
|
return f_run_args(filter, rte, 0, NULL, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum filter_return
|
||||||
|
f_run_args(const struct filter *filter, struct rte *rte, uint argc, const struct f_val *argv, int flags)
|
||||||
|
{
|
||||||
DBG( "Running filter `%s'...", filter->name );
|
DBG( "Running filter `%s'...", filter->name );
|
||||||
|
|
||||||
/* Initialize the filter state */
|
/* Initialize the filter state */
|
||||||
@ -221,7 +232,7 @@ f_run(const struct filter *filter, struct rte *rte, int flags)
|
|||||||
f_stack_init(filter_state);
|
f_stack_init(filter_state);
|
||||||
|
|
||||||
/* Run the interpreter itself */
|
/* Run the interpreter itself */
|
||||||
enum filter_return fret = interpret(&filter_state, filter->root, NULL);
|
enum filter_return fret = interpret(&filter_state, filter->root, argc, argv, NULL);
|
||||||
|
|
||||||
/* Process the filter output, log it and return */
|
/* Process the filter output, log it and return */
|
||||||
if (fret < F_ACCEPT) {
|
if (fret < F_ACCEPT) {
|
||||||
@ -247,7 +258,7 @@ f_run(const struct filter *filter, struct rte *rte, int flags)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
enum filter_return
|
enum filter_return
|
||||||
f_eval_rte(const struct f_line *expr, struct rte *rte)
|
f_eval_rte(const struct f_line *expr, struct rte *rte, uint argc, const struct f_val *argv, struct f_val *pres)
|
||||||
{
|
{
|
||||||
filter_state = (struct filter_state) {
|
filter_state = (struct filter_state) {
|
||||||
.rte = rte,
|
.rte = rte,
|
||||||
@ -255,9 +266,7 @@ f_eval_rte(const struct f_line *expr, struct rte *rte)
|
|||||||
|
|
||||||
f_stack_init(filter_state);
|
f_stack_init(filter_state);
|
||||||
|
|
||||||
ASSERT(!rta_is_cached(rte->attrs));
|
return interpret(&filter_state, expr, argc, argv, pres);
|
||||||
|
|
||||||
return interpret(&filter_state, expr, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -273,7 +282,7 @@ f_eval(const struct f_line *expr, struct f_val *pres)
|
|||||||
|
|
||||||
f_stack_init(filter_state);
|
f_stack_init(filter_state);
|
||||||
|
|
||||||
enum filter_return fret = interpret(&filter_state, expr, pres);
|
enum filter_return fret = interpret(&filter_state, expr, 0, NULL, pres);
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,8 @@ struct filter {
|
|||||||
struct rte;
|
struct rte;
|
||||||
|
|
||||||
enum filter_return f_run(const struct filter *filter, struct rte *rte, int flags);
|
enum filter_return f_run(const struct filter *filter, struct rte *rte, int flags);
|
||||||
enum filter_return f_eval_rte(const struct f_line *expr, struct rte *rte);
|
enum filter_return f_run_args(const struct filter *filter, struct rte *rte, uint argc, const struct f_val *argv, int flags);
|
||||||
|
enum filter_return f_eval_rte(const struct f_line *expr, struct rte *rte, uint argc, const struct f_val *argv, struct f_val *pres);
|
||||||
enum filter_return f_eval_buf(const struct f_line *expr, buffer *buf);
|
enum filter_return f_eval_buf(const struct f_line *expr, buffer *buf);
|
||||||
|
|
||||||
struct f_val cf_eval_tmp(const struct f_inst *inst, int type);
|
struct f_val cf_eval_tmp(const struct f_inst *inst, int type);
|
||||||
|
@ -122,7 +122,7 @@ static_announce_rte(struct static_proto *p, struct static_route *r)
|
|||||||
|
|
||||||
/* Evaluate the filter */
|
/* Evaluate the filter */
|
||||||
if (r->cmds)
|
if (r->cmds)
|
||||||
f_eval_rte(r->cmds, e);
|
f_eval_rte(r->cmds, e, 0, NULL, NULL);
|
||||||
|
|
||||||
rte_update(p->p.main_channel, r->net, e, src);
|
rte_update(p->p.main_channel, r->net, e, src);
|
||||||
static_free_source(src, r->index);
|
static_free_source(src, r->index);
|
||||||
|
Loading…
Reference in New Issue
Block a user