From 092c4930277c0f0f0dcb0c4013ff642314f90842 Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Fri, 6 Jul 2018 02:04:45 +0200 Subject: [PATCH] Nest: Fix race condition during reconfiguration, part 2 If export filter is changed during reconfiguration and a route disappears between reconfiguration and refeed (e.g., if the route is a static route also removed during the reconfiguration), the route is not withdrawn. The issue was fixed for regular channels by an earlier patch. This patch fixes the issue for channels in RA_ACCEPTED mode (first-pass-the-filter), used by BGP with 'secondary' option. --- nest/rt-table.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nest/rt-table.c b/nest/rt-table.c index 9ce52428..9dcbda05 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -678,8 +678,18 @@ rt_notify_accepted(struct channel *c, net *net, rte *new_changed, rte *old_chang * * - We found new_best the same as new_changed, therefore it cannot * be old_best and we have to continue search for old_best. + * + * There is also a hack to ensure consistency in case of changed filters. + * It does not find the proper old_best, just selects a non-NULL route. */ + /* Hack for changed filters */ + if (old_changed && (old_changed->lastmod <= c->last_tx_filter_change)) + { + old_best = old_changed; + goto found; + } + /* First case */ if (old_meet) if (old_best = export_filter(c, old_changed, &old_free, 1))