struct in_addr *gate, unsigned int ifindex,
vrf_id_t, u_int32_t, safi_t safi);
-extern struct rib *rib_match_ipv4 (struct in_addr, safi_t safi, vrf_id_t);
+extern struct rib *rib_match_ipv4 (struct in_addr, safi_t safi, vrf_id_t,
+ struct route_node **rn_out);
extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *, vrf_id_t);
}
struct rib *
-rib_match_ipv4 (struct in_addr addr, safi_t safi, vrf_id_t vrf_id)
+rib_match_ipv4 (struct in_addr addr, safi_t safi, vrf_id_t vrf_id,
+ struct route_node **rn_out)
{
struct prefix_ipv4 p;
struct route_table *table;
}
else
{
- if (match->type == ZEBRA_ROUTE_CONNECT)
- /* Directly point connected route. */
- return match;
- else
+ if (match->type != ZEBRA_ROUTE_CONNECT)
{
+ int found = 0;
for (ALL_NEXTHOPS_RO(match->nexthop, newhop, tnewhop, recursing))
if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB))
- return match;
- return NULL;
+ {
+ found = 1;
+ break;
+ }
+ if (!found)
+ return NULL;
}
+
+ if (rn_out)
+ *rn_out = rn;
+ return match;
}
}
return NULL;
struct nexthop *nexthop;
/* Lookup nexthop. */
- rib = rib_match_ipv4 (addr, SAFI_UNICAST, vrf_id);
+ rib = rib_match_ipv4 (addr, SAFI_UNICAST, vrf_id, NULL);
/* Get output stream. */
s = client->obuf;
struct nexthop *nexthop;
/* Lookup nexthop. */
- rib = rib_match_ipv4 (addr, SAFI_MULTICAST, zvrf->vrf_id);
+ rib = rib_match_ipv4 (addr, SAFI_MULTICAST, zvrf->vrf_id, NULL);
if (IS_ZEBRA_DEBUG_PACKET && IS_ZEBRA_DEBUG_RECV)
zlog_debug("%s: %s mrib entry found.", __func__, rib ? "Matching" : "No matching");
if (!rib) {
/* Retry lookup with unicast rib */
- rib = rib_match_ipv4 (addr, SAFI_UNICAST, zvrf->vrf_id);
+ rib = rib_match_ipv4 (addr, SAFI_UNICAST, zvrf->vrf_id, NULL);
if (IS_ZEBRA_DEBUG_PACKET && IS_ZEBRA_DEBUG_RECV)
zlog_debug("%s: %s rib entry found.", __func__, rib ? "Matching" : "No matching");
}