diff options
author | paul <paul> | 2007-04-10 19:32:10 +0000 |
---|---|---|
committer | paul <paul> | 2007-04-10 19:32:10 +0000 |
commit | d7eb1b49879528d356c01180ed2eeeb129d9b048 (patch) | |
tree | 5045ff82664ef73fa8b03f5766ecf991c41a579a | |
parent | def52b1b93e293ba3d0f7ac6313e109de341cbfd (diff) | |
download | quagga-d7eb1b49879528d356c01180ed2eeeb129d9b048.tar.bz2 quagga-d7eb1b49879528d356c01180ed2eeeb129d9b048.tar.xz |
[bgpd] V. quick route flap gets mistaken for duplicate, route is then ignored
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.
-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", |