[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

(cherry picked from commit 439d087d0b)
This commit is contained in:
Alexander V. Chernikov 2021-04-27 08:23:29 +00:00
parent 2c0d16218e
commit 59b3b210a6

View file

@ -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;
}