aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2021-04-27 08:23:29 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2021-04-27 08:31:40 +0000
commit439d087d0b55574db81f4a2799a411c1236d95e3 (patch)
treeb48c907d7c8c7f37118a5eb739b6f8ffcd0edcca
parent25682e6a495fc6669d799bb64acdaf14d653173e (diff)
downloadsrc-439d087d0b55574db81f4a2799a411c1236d95e3.tar.gz
src-439d087d0b55574db81f4a2799a411c1236d95e3.zip
[fib algo] always commit static routes synchronously.
Modular fib lookup framework features logic that allows route update batching for the algorithms that cannot easily apply the routing change without rebuilding. As a result, dataplane lookups may return old data until the the sync takes place. With the default sync timeout of 50ms, it is possible that new binary like ping(8) executed exactly after route(8) will still use the old fib data. To address some aspects of the problem, framework executes all rtable changes without RTF_GATEWAY synchronously. To fix the aforementioned problem, this diff extends sync execution for all RTF_STATIC routes (e.g. ones maintained by route(8). This fixes a bunch of tests in the networking space. Reported by: ci, arichardson MFC after: 2 weeks
-rw-r--r--sys/net/route/fib_algo.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/net/route/fib_algo.c b/sys/net/route/fib_algo.c
index 5dff2690454d..9fdc80001986 100644
--- a/sys/net/route/fib_algo.c
+++ b/sys/net/route/fib_algo.c
@@ -667,13 +667,21 @@ need_immediate_sync(struct fib_data *fd, struct rib_cmd_info *rc)
switch (rc->rc_cmd) {
case RTM_ADD:
nh = rc->rc_nh_new;
- if (!NH_IS_NHGRP(nh) && (!(nh->nh_flags & NHF_GATEWAY)))
- return (true);
+ if (!NH_IS_NHGRP(nh)) {
+ if (!(nh->nh_flags & NHF_GATEWAY))
+ return (true);
+ if (nhop_get_rtflags(nh) & RTF_STATIC)
+ return (true);
+ }
break;
case RTM_DELETE:
nh = rc->rc_nh_old;
- if (!NH_IS_NHGRP(nh) && (!(nh->nh_flags & NHF_GATEWAY)))
- return (true);
+ if (!NH_IS_NHGRP(nh)) {
+ if (!(nh->nh_flags & NHF_GATEWAY))
+ return (true);
+ if (nhop_get_rtflags(nh) & RTF_STATIC)
+ return (true);
+ }
break;
}