]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: use link scope for interface routes
authorTimo Teräs <timo.teras@iki.fi>
Fri, 15 Jan 2016 15:36:30 +0000 (17:36 +0200)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 23 Sep 2016 13:51:56 +0000 (09:51 -0400)
In linux, 'scope' is a hint of distance of the IP. And this is
evident from the fact that only lower scope can be used as recursive
via lookup result. This changes all interface routes scope to link
so kernel will allow regular routes to use it as via. Then we do
not need to use the 'onlink' attribute.

Signed-off-by: Timo Teräs <timo.teras@iki.fi>
zebra/rt_netlink.c
zebra/zebra_rib.c

index 95c8892979d14367e34792ea1f68bb7a02d518fb..79f20259a10e41d7bf69f482f43ebe53785ea4a1 100644 (file)
@@ -2428,7 +2428,7 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
   req.r.rtm_family = family;
   req.r.rtm_dst_len = p->prefixlen;
   req.r.rtm_protocol = RTPROT_ZEBRA;
-  req.r.rtm_scope = RT_SCOPE_UNIVERSE;
+  req.r.rtm_scope = RT_SCOPE_LINK;
 
   if ((rib->flags & ZEBRA_FLAG_BLACKHOLE) || (rib->flags & ZEBRA_FLAG_REJECT))
     discard = 1;
@@ -2508,6 +2508,9 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
       if (cmd == RTM_DELROUTE && !CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
         continue;
 
+      if (nexthop->type != NEXTHOP_TYPE_IFINDEX)
+        req.r.rtm_scope = RT_SCOPE_UNIVERSE;
+
       nexthop_num++;
     }
 
index f57c0b5d678d95936f0e19fff3c0e69909efae92..775619ac2df6fab48425ae341cf5738caf5b2db5 100644 (file)
@@ -483,27 +483,16 @@ nexthop_active_ipv4 (struct rib *rib, struct nexthop *nexthop, int set,
                          {
                            resolved_hop->type = newhop->type;
                            resolved_hop->gate.ipv4 = newhop->gate.ipv4;
-
-                           if (newhop->ifindex)
-                             {
-                               resolved_hop->type = NEXTHOP_TYPE_IPV4_IFINDEX;
-                               resolved_hop->ifindex = newhop->ifindex;
-                               if (newhop->flags & NEXTHOP_FLAG_ONLINK)
-                                 resolved_hop->flags |= NEXTHOP_FLAG_ONLINK;
-                             }
+                           resolved_hop->ifindex = newhop->ifindex;
                          }
 
-                       /* If the resolving route is an interface route,
-                        * it means the gateway we are looking up is connected
-                        * to that interface. (The actual network is _not_ onlink).
-                        * Therefore, the resolved route should have the original
-                        * gateway as nexthop as it is directly connected.
-                        *
-                        * On Linux, we have to set the onlink netlink flag because
-                        * otherwise, the kernel won't accept the route. */
+                       /* If the resolving route is an interface route, it
+                        * means the gateway we are looking up is connected
+                        * to that interface. Therefore, the resolved route
+                        * should have the original gateway as nexthop as it
+                        * is directly connected. */
                        if (newhop->type == NEXTHOP_TYPE_IFINDEX)
                          {
-                           resolved_hop->flags |= NEXTHOP_FLAG_ONLINK;
                            resolved_hop->type = NEXTHOP_TYPE_IPV4_IFINDEX;
                            resolved_hop->gate.ipv4 = nexthop->gate.ipv4;
                            resolved_hop->ifindex = newhop->ifindex;