From: Everton Marques <[email protected]>

This is the same as rib_lookup_ipv4(), without the SAFI hardcoded.

Cc: Balaji G <[email protected]>
Cc: Everton Marques <[email protected]>
Signed-off-by: David Lamparter <[email protected]>
---
 zebra/rib.h       |  1 +
 zebra/zebra_rib.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/zebra/rib.h b/zebra/rib.h
index d3a83c6..13011e2 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -419,6 +419,7 @@ extern int rib_delete_ipv4 (int type, int flags, struct 
prefix_ipv4 *p,
                            u_int32_t, safi_t safi);
 
 extern struct rib *rib_match_ipv4 (struct in_addr);
+extern struct rib *rib_match_ipv4_safi (struct in_addr addr, safi_t safi);
 
 extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *);
 
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 8354513..5b9b00e 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -782,6 +782,63 @@ rib_match_ipv4 (struct in_addr addr)
 }
 
 struct rib *
+rib_match_ipv4_safi (struct in_addr addr, safi_t safi)
+{
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *match;
+  struct nexthop *newhop, *tnewhop;
+  int recursing;
+
+  /* Lookup table.  */
+  table = vrf_table (AFI_IP, safi, 0);
+  if (! table)
+    return 0;
+
+  rn = route_node_match_ipv4 (table, &addr);
+
+  while (rn)
+    {
+      route_unlock_node (rn);
+
+      /* Pick up selected route. */
+      RNODE_FOREACH_RIB (rn, match)
+       {
+         if (CHECK_FLAG (match->status, RIB_ENTRY_REMOVED))
+           continue;
+         if (CHECK_FLAG (match->flags, ZEBRA_FLAG_SELECTED))
+           break;
+       }
+
+      /* If there is no selected route or matched route is EGP, go up
+         tree. */
+      if (! match
+         || match->type == ZEBRA_ROUTE_BGP)
+       {
+         do {
+           rn = rn->parent;
+         } while (rn && rn->info == NULL);
+         if (rn)
+           route_lock_node (rn);
+       }
+      else
+       {
+         if (match->type == ZEBRA_ROUTE_CONNECT)
+           /* Directly point connected route. */
+           return match;
+         else
+           {
+             for (ALL_NEXTHOPS_RO(match->nexthop, newhop, tnewhop, recursing))
+               if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB))
+                 return match;
+             return NULL;
+           }
+       }
+    }
+  return NULL;
+}
+
+struct rib *
 rib_lookup_ipv4 (struct prefix_ipv4 *p)
 {
   struct route_table *table;
-- 
2.0.4


_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to