diff options
-rw-r--r-- | zebra/rt_netlink.c | 20 | ||||
-rw-r--r-- | zebra/zebra_rib.c | 21 |
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) |