]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Netlink: Ignore dead routes
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Thu, 14 Jan 2021 00:51:09 +0000 (01:51 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Thu, 14 Jan 2021 01:01:07 +0000 (02:01 +0100)
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

index 6d98e53d27be9cd3b06f73d8ed7729604f7e7053..fdf3f2db1d2c269a9283b461dea86a3041247695 100644 (file)
@@ -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)
        {