diff options
| -rw-r--r-- | bgpd/ChangeLog | 10 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 23 | 
2 files changed, 30 insertions, 3 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index fac0df90..653ce86e 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,13 @@ +2007-04-08 Paul Jakma <paul.jakma@sun.com> + +	* bgp_route.c: (general) Same bug as fixed on 2006-11-28 by ajs for +	  bgp static routes, but for main BGP RIB: Quick 'flap' of routes +	  can cause bgpd to mistake a new route for a duplicate route, +	  due to presence of removed, but not yet processed BGP RIB entry. +	  (bgp_update_rsclient) Ignore REMOVED bgp_info for duplicate, +	  restore route instead. +	  (bgp_update_main) Ditto. +  2007-04-07 Paul Jakma <paul.jakma@sun.com>  	* bgpd.c: (general) Fix bug #352 diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index c464cd04..c33c596e 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -1742,7 +1742,8 @@ bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,        ri->uptime = time (NULL);        /* Same attribute comes in. */ -      if (attrhash_cmp (ri->attr, attr_new)) +      if (!CHECK_FLAG(ri->flags, BGP_INFO_REMOVED) +          && attrhash_cmp (ri->attr, attr_new))          {            bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED); @@ -1760,6 +1761,10 @@ bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,                      return;          } +      /* Withdraw/Announce before we fully processed the withdraw */ +      if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) +        bgp_info_restore (rn, ri); +              /* Received Logging. */        if (BGP_DEBUG (update, UPDATE_IN))          zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d for RS-client %s", @@ -1987,7 +1992,8 @@ bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,        ri->uptime = time (NULL);        /* Same attribute comes in. */ -      if (attrhash_cmp (ri->attr, attr_new)) +      if (!CHECK_FLAG (ri->flags, BGP_INFO_REMOVED)  +          && attrhash_cmp (ri->attr, attr_new))  	{  	  bgp_info_unset_flag (rn, ri, BGP_INFO_ATTR_CHANGED); @@ -2007,7 +2013,7 @@ bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,                    bgp_process (bgp, rn, afi, safi);                  }  	    } -	  else +          else /* Duplicate - odd */  	    {  	      if (BGP_DEBUG (update, UPDATE_IN))    		zlog (peer->log, LOG_DEBUG, @@ -2029,6 +2035,17 @@ bgp_update_main (struct peer *peer, struct prefix *p, struct attr *attr,  	  return 0;  	} +      /* Withdraw/Announce before we fully processed the withdraw */ +      if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) +        { +          if (BGP_DEBUG (update, UPDATE_IN)) +            zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d, flapped quicker than processing", +            peer->host, +            inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN), +            p->prefixlen); +          bgp_info_restore (rn, ri); +        } +        /* Received Logging. */        if (BGP_DEBUG (update, UPDATE_IN))    	zlog (peer->log, LOG_DEBUG, "%s rcvd %s/%d",  | 
