summaryrefslogtreecommitdiff
path: root/nest/rt-table.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2022-12-06 19:40:02 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2022-12-06 19:51:50 +0100
commite80156d9363a594ff23524f56d59f0eee160859d (patch)
treeb18539ff6b715e242c292d669792f7729de474d8 /nest/rt-table.c
parenta50d2fa65f3350ee55f5106b87a884d1b98e7761 (diff)
Nest: Avoid spurious announcements triggered by filtered routes
When filtered routes (enabled by 'import keep filtered' option) are updated, they trigger announcements by rte_announce(). For regular channels (e.g. type RA_OPTIMAL or RA_ANY) such announcement is just ignored, but in case of RA_ACCEPTED (BGP peer with 'secondary' option) it just reannounces the old (and still valid) best route. The patch ensures that such no-change is ignored even for these channels.
Diffstat (limited to 'nest/rt-table.c')
-rw-r--r--nest/rt-table.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c
index cb8c56a6..845b2483 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1112,7 +1112,20 @@ rte_announce(rtable *tab, uint type, net *net, rte *new, rte *old,
break;
case RA_ACCEPTED:
- rt_notify_accepted(c, net, new, old, 0);
+ /*
+ * The (new != old) condition is problematic here, as it would break
+ * the second usage pattern (announcement after bulk change, used in
+ * rt_next_hop_update_net(), which sends both new and old as NULL).
+ *
+ * But recursive next hops do not work with sorted tables anyways,
+ * such configuration is forbidden in BGP and not supported in
+ * rt_notify_accepted().
+ *
+ * The condition is needed to eliminate spurious announcements where
+ * both old and new routes are not valid (so they are NULL).
+ */
+ if (new != old)
+ rt_notify_accepted(c, net, new, old, 0);
break;
case RA_MERGED: