Fixes bug in pipe route filtering.

Routes comming through pipe from primary to secondary table were
filtered by both EXPORT and IMPORT filters, but they should be
only filtered by EXPORT filters.
This commit is contained in:
Ondrej Zajicek 2009-03-25 19:05:52 +01:00
parent 4d7d0cb137
commit 40b65f947a

View file

@ -483,22 +483,30 @@ rte_update(rtable *table, net *net, struct proto *p, rte *new)
rte_update_lock(); rte_update_lock();
if (new) if (new)
{ {
struct filter *filter = p->in_filter;
/* Do not filter routes going to the secondary side of the pipe,
that should only go through export filter.
FIXME Make a better check whether p is really a pipe. */
if (p->table != table)
filter = FILTER_ACCEPT;
if (!rte_validate(new)) if (!rte_validate(new))
{ {
rte_trace_in(D_FILTERS, p, new, "invalid"); rte_trace_in(D_FILTERS, p, new, "invalid");
goto drop; goto drop;
} }
if (p->in_filter == FILTER_REJECT) if (filter == FILTER_REJECT)
{ {
rte_trace_in(D_FILTERS, p, new, "filtered out"); rte_trace_in(D_FILTERS, p, new, "filtered out");
goto drop; goto drop;
} }
if (p->make_tmp_attrs) if (p->make_tmp_attrs)
tmpa = p->make_tmp_attrs(new, rte_update_pool); tmpa = p->make_tmp_attrs(new, rte_update_pool);
if (p->in_filter) if (filter)
{ {
ea_list *old_tmpa = tmpa; ea_list *old_tmpa = tmpa;
int fr = f_run(p->in_filter, &new, &tmpa, rte_update_pool, 0); int fr = f_run(filter, &new, &tmpa, rte_update_pool, 0);
if (fr > F_ACCEPT) if (fr > F_ACCEPT)
{ {
rte_trace_in(D_FILTERS, p, new, "filtered out"); rte_trace_in(D_FILTERS, p, new, "filtered out");