summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2016-01-15 17:36:30 +0200
committerPaul Jakma <paul.jakma@hpe.com>2016-02-26 14:11:46 +0000
commit82a6635ca580ccd3c31551c960ec3de816b6c15d (patch)
treed55f7b9894ccfda8f6b3295fd1efdf86356c1969
parent0abf6796c3d8ae8f5ea8624668424bc1554de25e (diff)
downloadquagga-82a6635ca580ccd3c31551c960ec3de816b6c15d.tar.bz2
quagga-82a6635ca580ccd3c31551c960ec3de816b6c15d.tar.xz
zebra: use link scope for interface routes
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>
-rw-r--r--zebra/rt_netlink.c6
-rw-r--r--zebra/zebra_rib.c21
2 files changed, 11 insertions, 16 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 4625ceab..6e22d63f 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 7cce13fe..92640872 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;