From 40b65f947aed065c03c5f2d5c66c6c794a5aadda Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Wed, 25 Mar 2009 19:05:52 +0100 Subject: [PATCH] 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. --- nest/rt-table.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/nest/rt-table.c b/nest/rt-table.c index 2af34307..3fa52676 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -483,22 +483,30 @@ rte_update(rtable *table, net *net, struct proto *p, rte *new) rte_update_lock(); 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)) { rte_trace_in(D_FILTERS, p, new, "invalid"); goto drop; } - if (p->in_filter == FILTER_REJECT) + if (filter == FILTER_REJECT) { rte_trace_in(D_FILTERS, p, new, "filtered out"); goto drop; } if (p->make_tmp_attrs) tmpa = p->make_tmp_attrs(new, rte_update_pool); - if (p->in_filter) + if (filter) { 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) { rte_trace_in(D_FILTERS, p, new, "filtered out");