]> git.puffer.fish Git - matthieu/frr.git/commitdiff
[bgpd] V. quick route flap gets mistaken for duplicate, route is then ignored
authorPaul Jakma <paul.jakma@sun.com>
Tue, 10 Apr 2007 19:32:10 +0000 (19:32 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Tue, 10 Apr 2007 19:32:10 +0000 (19:32 +0000)
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.

bgpd/ChangeLog
bgpd/bgp_route.c

index fac0df90e4819b816ae5c88a8896ca79e5e02455..653ce86e24c7c6e230bce81b14cfddee0551ae2f 100644 (file)
@@ -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
index c464cd0488e36f7276239b6e738596540bd6e819..c33c596eec80937ef11cd762813b9173e5e62ab5 100644 (file)
@@ -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",