diff options
| -rw-r--r-- | zebra/ChangeLog | 6 | ||||
| -rw-r--r-- | zebra/zebra_rib.c | 142 | 
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;  	}      } | 
