]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Netlink: Parse onlink flag even on direct routes
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 12 Oct 2022 15:57:26 +0000 (17:57 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 12 Oct 2022 15:57:26 +0000 (17:57 +0200)
While onlink flag is meaningful only with explicit next hops, it can be
defined also on direct routes. Parse it also in this case to avoid
periodic updates of the same route.

Thanks to Marcin Saklak for the bugreport.

sysdep/linux/netlink.c

index 8da26e37734cbd2ff20511153d5a0854f8ab2318..d9e81c104ac42bbfd448e2b652c625c5a9c623c8 100644 (file)
@@ -812,11 +812,11 @@ nl_parse_multipath(struct nl_parse_state *s, struct krt_proto *p, const net_addr
        rv->gw = rta_get_via(a[RTA_VIA]);
 #endif
 
+      if (nh->rtnh_flags & RTNH_F_ONLINK)
+       rv->flags |= RNF_ONLINK;
+
       if (ipa_nonzero(rv->gw))
        {
-         if (nh->rtnh_flags & RTNH_F_ONLINK)
-           rv->flags |= RNF_ONLINK;
-
          neighbor *nbr;
          nbr = neigh_find(&p->p, rv->gw, rv->iface,
                           (rv->flags & RNF_ONLINK) ? NEF_ONLINK : 0);
@@ -1708,6 +1708,9 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
        ra->nh.gw = rta_get_via(a[RTA_VIA]);
 #endif
 
+      if (i->rtm_flags & RTNH_F_ONLINK)
+       ra->nh.flags |= RNF_ONLINK;
+
       if (ipa_nonzero(ra->nh.gw))
        {
          /* Silently skip strange 6to4 routes */
@@ -1715,9 +1718,6 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
          if ((i->rtm_family == AF_INET6) && ipa_in_netX(ra->nh.gw, (net_addr *) &sit))
            return;
 
-         if (i->rtm_flags & RTNH_F_ONLINK)
-           ra->nh.flags |= RNF_ONLINK;
-
          neighbor *nbr;
          nbr = neigh_find(&p->p, ra->nh.gw, ra->nh.iface,
                           (ra->nh.flags & RNF_ONLINK) ? NEF_ONLINK : 0);