aboutsummaryrefslogtreecommitdiffstats
path: root/sysdep
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2021-01-14 01:51:09 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2021-01-14 02:01:07 +0100
commitdf83f626973fda1e67769d295c47d4d246e4c1c4 (patch)
tree96cb8bc5ccded91f27aa19a255c47eda49bcb798 /sysdep
parenta40ddf5c616465a93287e4ac41a98d04b4fb2b37 (diff)
downloadbird-df83f626973fda1e67769d295c47d4d246e4c1c4.tar.gz
Netlink: Ignore dead routes
With net.ipv4.conf.XXX.ignore_routes_with_linkdown sysctl, a user can ensure the kernel does not use a route whose target interface is down. Such route is marked with a 'dead' / RTNH_F_DEAD flag. Ignore these routes or multipath nexthops during scan. Thanks to Vincent Bernat for the original patch.
Diffstat (limited to 'sysdep')
-rw-r--r--sysdep/linux/netlink.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index 6d98e53d..fdf3f2db 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -697,6 +697,9 @@ nl_parse_multipath(struct nl_parse_state *s, struct krt_proto *p, struct rtattr
if ((len < sizeof(*nh)) || (len < nh->rtnh_len))
return NULL;
+ if (nh->rtnh_flags & RTNH_F_DEAD)
+ goto next;
+
*last = rv = lp_allocz(s->pool, NEXTHOP_MAX_SIZE);
last = &(rv->next);
@@ -772,7 +775,7 @@ nl_parse_multipath(struct nl_parse_state *s, struct krt_proto *p, struct rtattr
}
#endif
-
+ next:
len -= NLMSG_ALIGN(nh->rtnh_len);
nh = RTNH_NEXT(nh);
}
@@ -1683,6 +1686,9 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
break;
}
+ if (i->rtm_flags & RTNH_F_DEAD)
+ return;
+
ra->nh.iface = if_find_by_index(oif);
if (!ra->nh.iface)
{