summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/rt_netlink.c20
-rw-r--r--zebra/zebra_rib.c21
2 files changed, 41 insertions, 0 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 6a3df192..b38df20b 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1323,13 +1323,24 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
{
for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
{
+
if ((cmd == RTM_NEWROUTE
&& CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
|| (cmd == RTM_DELROUTE
&& CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))
{
+
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
{
+ if (IS_ZEBRA_DEBUG_KERNEL) {
+ zlog_info ("netlink_route_multipath(): %s %s/%d via %s if %u",
+ lookup (nlmsg_str, cmd),
+ inet_ntoa (p->u.prefix4),
+ p->prefixlen,
+ inet_ntoa (nexthop->rgate.ipv4),
+ nexthop->rifindex);
+ }
+
if (nexthop->rtype == NEXTHOP_TYPE_IPV4
|| nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
addattr_l (&req.n, sizeof req, RTA_GATEWAY,
@@ -1351,6 +1362,15 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
}
else
{
+ if (IS_ZEBRA_DEBUG_KERNEL) {
+ zlog_info ("netlink_route_multipath(): %s %s/%d via %s if %u",
+ lookup (nlmsg_str, cmd),
+ inet_ntoa (p->u.prefix4),
+ p->prefixlen,
+ inet_ntoa (nexthop->gate.ipv4),
+ nexthop->ifindex);
+ }
+
if (nexthop->type == NEXTHOP_TYPE_IPV4
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
addattr_l (&req.n, sizeof req, RTA_GATEWAY,
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 2209364c..09d2da5b 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1146,6 +1146,13 @@ rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
/* Apply mask. */
apply_mask_ipv4 (p);
+ if (IS_ZEBRA_DEBUG_KERNEL && gate)
+ zlog_info ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d",
+ inet_ntop (AF_INET, &p->prefix, buf1, BUFSIZ),
+ p->prefixlen,
+ inet_ntoa (*gate),
+ ifindex);
+
/* Lookup route node. */
rn = route_node_lookup (table, (struct prefix *) p);
if (! rn)
@@ -1192,6 +1199,20 @@ rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
break;
}
}
+ else if (gate)
+ {
+ nexthop = rib->nexthop;
+
+ /* Make sure that the route found has the same gateway. */
+ if (rib->type == type
+ && nexthop &&
+ (IPV4_ADDR_SAME (&nexthop->gate.ipv4, gate) ||
+ IPV4_ADDR_SAME (&nexthop->rgate.ipv4, gate)) )
+ {
+ same = rib;
+ break;
+ }
+ }
else
{
if (rib->type == type)