summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/ChangeLog6
-rw-r--r--zebra/zebra_rib.c142
2 files changed, 65 insertions, 83 deletions
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 9939d3e3..cbfb4b66 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,9 @@
+2005-09-21 David Young <dyoung@ojctech.com>
+
+ * zebra_rib.c: Reduce the height of some staircases. Fix
+ rib_delete_ipv6() to match routes in the RIB by their gateway as
+ well as by destination.
+
2005-09-21 Paul Jakma <paul.jakma@sun.com>
* zebra_rib.c: (static_uninstall_ipv{4,6}) Fix regression wrt
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 6cb686b7..060f46da 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1157,24 +1157,21 @@ rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p,
withdraw. */
for (rib = rn->info; rib; rib = rib->next)
{
- if (rib->type == ZEBRA_ROUTE_CONNECT)
- {
- nexthop = rib->nexthop;
-
- /* Duplicate connected route comes in. */
- if (rib->type == type
- && nexthop && nexthop->type == NEXTHOP_TYPE_IFINDEX
- && nexthop->ifindex == ifindex)
- {
- rib->refcnt++;
- return 0 ;
- }
- }
- else if (rib->type == type)
+ if (rib->type != type)
+ continue;
+ if (rib->type != ZEBRA_ROUTE_CONNECT)
{
same = rib;
break;
}
+ /* Duplicate connected route comes in. */
+ else if ((nexthop = rib->nexthop) &&
+ nexthop->type == NEXTHOP_TYPE_IFINDEX &&
+ nexthop->ifindex == ifindex)
+ {
+ rib->refcnt++;
+ return 0 ;
+ }
}
/* Allocate new rib structure. */
@@ -1274,6 +1271,7 @@ rib_add_ipv4_multipath (struct prefix_ipv4 *p, struct rib *rib)
return 0;
}
+/* XXX factor with rib_delete_ipv6 */
int
rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
struct in_addr *gate, unsigned int ifindex, u_int32_t vrf_id)
@@ -1329,46 +1327,29 @@ rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
fib = rib;
- if (rib->type == ZEBRA_ROUTE_CONNECT)
+ if (rib->type != type)
+ continue;
+ if (rib->type == ZEBRA_ROUTE_CONNECT && (nexthop = rib->nexthop) &&
+ nexthop->type == NEXTHOP_TYPE_IFINDEX && nexthop->ifindex == ifindex)
{
- nexthop = rib->nexthop;
-
- if (rib->type == type
- && nexthop && nexthop->type == NEXTHOP_TYPE_IFINDEX
- && nexthop->ifindex == ifindex)
+ if (rib->refcnt)
{
- if (rib->refcnt)
- {
- rib->refcnt--;
- route_unlock_node (rn);
- route_unlock_node (rn);
- return 0;
- }
- same = rib;
- break;
+ rib->refcnt--;
+ route_unlock_node (rn);
+ route_unlock_node (rn);
+ return 0;
}
+ same = rib;
+ break;
}
- else if (gate)
+ /* Make sure that the route found has the same gateway. */
+ else if (gate == NULL ||
+ ((nexthop = rib->nexthop) &&
+ (IPV4_ADDR_SAME (&nexthop->gate.ipv4, gate) ||
+ IPV4_ADDR_SAME (&nexthop->rgate.ipv4, 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)
- {
- same = rib;
- break;
- }
+ same = rib;
+ break;
}
}
@@ -1785,23 +1766,20 @@ rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
withdraw. */
for (rib = rn->info; rib; rib = rib->next)
{
- if (rib->type == ZEBRA_ROUTE_CONNECT)
- {
- nexthop = rib->nexthop;
-
- if (rib->type == type
- && nexthop && nexthop->type == NEXTHOP_TYPE_IFINDEX
- && nexthop->ifindex == ifindex)
- {
- rib->refcnt++;
- return 0;
- }
- }
- else if (rib->type == type)
+ if (rib->type != type)
+ continue;
+ if (rib->type != ZEBRA_ROUTE_CONNECT)
{
same = rib;
break;
}
+ else if ((nexthop = rib->nexthop) &&
+ nexthop->type == NEXTHOP_TYPE_IFINDEX &&
+ nexthop->ifindex == ifindex)
+ {
+ rib->refcnt++;
+ return 0;
+ }
}
/* Allocate new rib structure. */
@@ -1845,6 +1823,7 @@ rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
return 0;
}
+/* XXX factor with rib_delete_ipv6 */
int
rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id)
@@ -1893,32 +1872,29 @@ rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
fib = rib;
- if (rib->type == ZEBRA_ROUTE_CONNECT)
+ if (rib->type != type)
+ continue;
+ if (rib->type == ZEBRA_ROUTE_CONNECT && (nexthop = rib->nexthop) &&
+ nexthop->type == NEXTHOP_TYPE_IFINDEX && nexthop->ifindex == ifindex)
{
- nexthop = rib->nexthop;
-
- if (rib->type == type
- && nexthop && nexthop->type == NEXTHOP_TYPE_IFINDEX
- && nexthop->ifindex == ifindex)
+ if (rib->refcnt)
{
- if (rib->refcnt)
- {
- rib->refcnt--;
- route_unlock_node (rn);
- route_unlock_node (rn);
- return 0;
- }
- same = rib;
- break;
+ rib->refcnt--;
+ route_unlock_node (rn);
+ route_unlock_node (rn);
+ return 0;
}
+ same = rib;
+ break;
}
- else
+ /* Make sure that the route found has the same gateway. */
+ else if (gate == NULL ||
+ ((nexthop = rib->nexthop) &&
+ (IPV6_ADDR_SAME (&nexthop->gate.ipv6, gate) ||
+ IPV6_ADDR_SAME (&nexthop->rgate.ipv6, gate))))
{
- if (rib->type == type)
- {
- same = rib;
- break;
- }
+ same = rib;
+ break;
}
}