My original comment still stands: I agree that your use of finer grained RT_SCOPE_LINK and RT_SCOPE_UNIVERSE is a good thing. My only real problem with the patch was the removal of this line:
- resolved_hop->flags |= NEXTHOP_FLAG_ONLINK; Put it back and I believe we would be ok. thanks! donald On Wed, Dec 23, 2015 at 9:47 AM, Timo Teräs <[email protected]> wrote: > 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 <[email protected]> > --- > zebra/rt_netlink.c | 6 +++++- > zebra/zebra_rib.c | 21 ++++++--------------- > 2 files changed, 11 insertions(+), 16 deletions(-) > > diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c > index 5a3576f..a016d28 100644 > --- a/zebra/rt_netlink.c > +++ b/zebra/rt_netlink.c > @@ -1638,7 +1638,7 @@ netlink_route_multipath (int cmd, struct prefix *p, > struct rib *rib, > req.r.rtm_table = rib->table; > 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; > @@ -1706,6 +1706,10 @@ 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 && > + nexthop->type != NEXTHOP_TYPE_IFNAME) > + req.r.rtm_scope = RT_SCOPE_UNIVERSE; > + > nexthop_num++; > } > > diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c > index 7cce13f..9264087 100644 > --- a/zebra/zebra_rib.c > +++ b/zebra/zebra_rib.c > @@ -439,26 +439,17 @@ 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; > - } > + 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 > || newhop->type == NEXTHOP_TYPE_IFNAME) > { > - 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; > -- > 2.6.4 > > > _______________________________________________ > Quagga-dev mailing list > [email protected] > https://lists.quagga.net/mailman/listinfo/quagga-dev
_______________________________________________ Quagga-dev mailing list [email protected] https://lists.quagga.net/mailman/listinfo/quagga-dev
