From 33550aa869109b07405f7cac50f7287dc713eece Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Thu, 22 Jan 2015 19:09:36 +0100 Subject: [PATCH] zebra: return route_node from rib_match_ipv4_safi The multicast code needs to know the route_node in addition to the rib entry in order to perform distance or prefix-length comparisons. Add it as optional "out" pointer parameter. Cc: Everton Marques Cc: Balaji G Signed-off-by: David Lamparter --- zebra/rib.h | 3 ++- zebra/zebra_rib.c | 21 ++++++++++++++------- zebra/zserv.c | 6 +++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/zebra/rib.h b/zebra/rib.h index e912cfb205..8f23c57c17 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -369,7 +369,8 @@ extern int rib_delete_ipv4 (int type, u_short instance, int flags, struct prefix 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); diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index e428471564..87b0ebd79a 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -733,7 +733,8 @@ nexthop_active_ipv6 (struct rib *rib, struct nexthop *nexthop, int set, } 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; @@ -779,16 +780,22 @@ rib_match_ipv4 (struct in_addr addr, safi_t safi, vrf_id_t vrf_id) } 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; diff --git a/zebra/zserv.c b/zebra/zserv.c index eb616b0405..79da6ba7ab 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -788,7 +788,7 @@ zsend_ipv4_nexthop_lookup (struct zserv *client, struct in_addr addr, 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; @@ -974,14 +974,14 @@ zsend_ipv4_nexthop_lookup_mrib (struct zserv *client, struct in_addr addr, struc 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"); } -- 2.39.5