From df83f626973fda1e67769d295c47d4d246e4c1c4 Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Thu, 14 Jan 2021 01:51:09 +0100 Subject: [PATCH] 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. --- sysdep/linux/netlink.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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) {