]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Refactor rib_match_ipv[4|6]
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 24 Aug 2016 04:48:37 +0000 (00:48 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 1 Sep 2016 11:20:18 +0000 (07:20 -0400)
the rib_match_ipv4 and rib_match_ipv6 functions were
the same.  Refactor to 1 function.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
zebra/rib.h
zebra/zebra_rib.c
zebra/zserv.c

index 32f370f9ef12c26d8afc5d58ab9616a58e577c2d..7fd29dcd5aa4a17e8d79e2cffcc857cc5b23e4db 100644 (file)
@@ -349,8 +349,8 @@ extern int rib_delete_ipv4 (int type, u_short instance, int flags, struct prefix
                            struct in_addr *gate, ifindex_t 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,
-                                  struct route_node **rn_out);
+extern struct rib *rib_match (afi_t afi, safi_t safi, vrf_id_t, union g_addr *,
+                             struct route_node **rn_out);
 extern struct rib *rib_match_ipv4_multicast (struct in_addr addr,
                                             struct route_node **rn_out);
 
@@ -378,8 +378,6 @@ rib_delete_ipv6 (int type, u_short instance, int flags, struct prefix_ipv6 *p,
 
 extern struct rib *rib_lookup_ipv6 (struct in6_addr *, vrf_id_t);
 
-extern struct rib *rib_match_ipv6 (struct in6_addr *, vrf_id_t);
-
 extern struct route_table *rib_table_ipv6;
 
 extern int
index 0db1b0a689431d2f16c64c191f1004e4df67d71a..3a160825d5eb6bd4a8d5c87b6d5fd4a9dcd491be 100644 (file)
@@ -747,10 +747,10 @@ 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,
-               struct route_node **rn_out)
+rib_match (afi_t afi, safi_t safi, vrf_id_t vrf_id,
+          union g_addr *addr, struct route_node **rn_out)
 {
-  struct prefix_ipv4 p;
+  struct prefix p;
   struct route_table *table;
   struct route_node *rn;
   struct rib *match;
@@ -758,14 +758,18 @@ rib_match_ipv4 (struct in_addr addr, safi_t safi, vrf_id_t vrf_id,
   int recursing;
 
   /* Lookup table.  */
-  table = zebra_vrf_table (AFI_IP, safi, vrf_id);
+  table = zebra_vrf_table (afi, safi, vrf_id);
   if (! table)
     return 0;
 
-  memset (&p, 0, sizeof (struct prefix_ipv4));
-  p.family = AF_INET;
+  memset (&p, 0, sizeof (struct prefix));
+  p.family = afi;
+  p.u.prefix = *(u_char *)addr;
   p.prefixlen = IPV4_MAX_PREFIXLEN;
-  p.prefix = addr;
+  if (afi == AFI_IP)
+    p.prefixlen = IPV4_MAX_PREFIXLEN;
+  else
+    p.prefixlen = IPV6_MAX_PREFIXLEN;
 
   rn = route_node_match (table, (struct prefix *) &p);
 
@@ -820,23 +824,23 @@ rib_match_ipv4_multicast (struct in_addr addr, struct route_node **rn_out)
 {
   struct rib *rib = NULL, *mrib = NULL, *urib = NULL;
   struct route_node *m_rn = NULL, *u_rn = NULL;
-  int skip_bgp = 0; /* bool */
+  union g_addr gaddr = { .ipv4 = addr };
 
   switch (ipv4_multicast_mode)
     {
     case MCAST_MRIB_ONLY:
-      return rib_match_ipv4 (addr, SAFI_MULTICAST, skip_bgp, rn_out);
+      return rib_match (AFI_IP, SAFI_MULTICAST, VRF_DEFAULT, &gaddr, rn_out);
     case MCAST_URIB_ONLY:
-      return rib_match_ipv4 (addr, SAFI_UNICAST, skip_bgp, rn_out);
+      return rib_match (AFI_IP, SAFI_UNICAST, VRF_DEFAULT, &gaddr, rn_out);
     case MCAST_NO_CONFIG:
     case MCAST_MIX_MRIB_FIRST:
-      rib = mrib = rib_match_ipv4 (addr, SAFI_MULTICAST, skip_bgp, &m_rn);
+      rib = mrib = rib_match (AFI_IP, SAFI_MULTICAST, VRF_DEFAULT, &gaddr, &m_rn);
       if (!mrib)
-       rib = urib = rib_match_ipv4 (addr, SAFI_UNICAST, skip_bgp, &u_rn);
+       rib = urib = rib_match (AFI_IP, SAFI_UNICAST, VRF_DEFAULT, &gaddr, &u_rn);
       break;
     case MCAST_MIX_DISTANCE:
-      mrib = rib_match_ipv4 (addr, SAFI_MULTICAST, skip_bgp, &m_rn);
-      urib = rib_match_ipv4 (addr, SAFI_UNICAST, skip_bgp, &u_rn);
+      mrib = rib_match (AFI_IP, SAFI_MULTICAST, VRF_DEFAULT, &gaddr, &m_rn);
+      urib = rib_match (AFI_IP, SAFI_UNICAST, VRF_DEFAULT, &gaddr, &u_rn);
       if (mrib && urib)
        rib = urib->distance < mrib->distance ? urib : mrib;
       else if (mrib)
@@ -845,8 +849,8 @@ rib_match_ipv4_multicast (struct in_addr addr, struct route_node **rn_out)
        rib = urib;
       break;
     case MCAST_MIX_PFXLEN:
-      mrib = rib_match_ipv4 (addr, SAFI_MULTICAST, skip_bgp, &m_rn);
-      urib = rib_match_ipv4 (addr, SAFI_UNICAST, skip_bgp, &u_rn);
+      mrib = rib_match (AFI_IP, SAFI_MULTICAST, VRF_DEFAULT, &gaddr, &m_rn);
+      urib = rib_match (AFI_IP, SAFI_UNICAST, VRF_DEFAULT, &gaddr, &u_rn);
       if (mrib && urib)
        rib = u_rn->p.prefixlen > m_rn->p.prefixlen ? urib : mrib;
       else if (mrib)
@@ -1009,68 +1013,6 @@ rib_lookup_ipv4_route (struct prefix_ipv4 *p, union sockunion * qgate,
   return ZEBRA_RIB_NOTFOUND;
 }
 
-struct rib *
-rib_match_ipv6 (struct in6_addr *addr, vrf_id_t vrf_id)
-{
-  struct prefix_ipv6 p;
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *match;
-  struct nexthop *newhop, *tnewhop;
-  int recursing;
-
-  /* Lookup table.  */
-  table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return 0;
-
-  memset (&p, 0, sizeof (struct prefix_ipv6));
-  p.family = AF_INET6;
-  p.prefixlen = IPV6_MAX_PREFIXLEN;
-  IPV6_ADDR_COPY (&p.prefix, addr);
-
-  rn = route_node_match (table, (struct prefix *) &p);
-
-  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)
-       {
-         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;
-}
-
 #define RIB_SYSTEM_ROUTE(R) \
         ((R)->type == ZEBRA_ROUTE_KERNEL || (R)->type == ZEBRA_ROUTE_CONNECT)
 
index 84881e14a470bc754ac7b4fcf8c057b2f7e22184..73e84faca275687f5ac8874df3834408c39830a8 100644 (file)
@@ -722,9 +722,10 @@ zsend_ipv6_nexthop_lookup (struct zserv *client, struct in6_addr *addr,
   unsigned long nump;
   u_char num;
   struct nexthop *nexthop;
+  union g_addr gaddr = { .ipv6 = *addr };
 
   /* Lookup nexthop. */
-  rib = rib_match_ipv6 (addr, vrf_id);
+  rib = rib_match (AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, NULL);
 
   /* Get output stream. */
   s = client->obuf;
@@ -788,9 +789,10 @@ zsend_ipv4_nexthop_lookup (struct zserv *client, struct in_addr addr,
   unsigned long nump;
   u_char num;
   struct nexthop *nexthop;
+  union g_addr gaddr = { .ipv4 = addr };
 
   /* Lookup nexthop. */
-  rib = rib_match_ipv4 (addr, SAFI_UNICAST, vrf_id, NULL);
+  rib = rib_match (AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, NULL);
 
   /* Get output stream. */
   s = client->obuf;