Don't assume BGP peer sends back negotiated hold time, pick smallest
authorBrendan O'Dea <bod@optus.net>
Mon, 15 Nov 2004 06:49:56 +0000 (06:49 +0000)
committerBrendan O'Dea <bod@optus.net>
Mon, 15 Nov 2004 06:49:56 +0000 (06:49 +0000)
Changes
bgp.c

diff --git a/Changes b/Changes
index 5ac335f..0cde786 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,6 @@
 * ? Brendan O'Dea <bod@optusnet.com.au> 2.0.7
 - Fix socket creation in host_unreachable() (thanks to Bjørn Augestad)
 * ? Brendan O'Dea <bod@optusnet.com.au> 2.0.7
 - Fix socket creation in host_unreachable() (thanks to Bjørn Augestad)
+- Don't assume BGP peer sends back negotiated hold time, pick smallest
 
 * Thu Nov 11 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.6
 - Make BGP keepalive/hold time configurable
 
 * Thu Nov 11 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.6
 - Make BGP keepalive/hold time configurable
diff --git a/bgp.c b/bgp.c
index 77ecb2f..2d0954b 100644 (file)
--- a/bgp.c
+++ b/bgp.c
@@ -10,7 +10,7 @@
  *   nor RFC2385 (which requires a kernel patch on 2.4 kernels).
  */
 
  *   nor RFC2385 (which requires a kernel patch on 2.4 kernels).
  */
 
-char const *cvs_id_bgp = "$Id: bgp.c,v 1.6 2004-11-11 03:07:42 bodea Exp $";
+char const *cvs_id_bgp = "$Id: bgp.c,v 1.7 2004-11-15 06:49:56 bodea Exp $";
 
 #include <stdlib.h>
 #include <unistd.h>
 
 #include <stdlib.h>
 #include <unistd.h>
@@ -857,6 +857,7 @@ static int bgp_handle_input(struct bgp_peer *peer)
     case BGP_MSG_OPEN:
        {
            struct bgp_data_open data;
     case BGP_MSG_OPEN:
        {
            struct bgp_data_open data;
+           int hold;
            int i;
 
            for (i = 0; i < sizeof(p->header.marker); i++)
            int i;
 
            for (i = 0; i < sizeof(p->header.marker); i++)
@@ -903,15 +904,19 @@ static int bgp_handle_input(struct bgp_peer *peer)
                return 0;
            }
 
                return 0;
            }
 
-           if ((peer->hold = ntohs(data.hold_time)) < 3)
+           if ((hold = ntohs(data.hold_time)) < 3)
            {
                LOG(1, 0, 0, 0, "Bad hold time (%d) from BGP peer %s\n",
            {
                LOG(1, 0, 0, 0, "Bad hold time (%d) from BGP peer %s\n",
-                   peer->hold, peer->name);
+                   hold, peer->name);
 
                bgp_send_notification(peer, BGP_ERR_OPEN, BGP_ERR_OPN_HOLD_TIME);
                return 0;
            }
 
 
                bgp_send_notification(peer, BGP_ERR_OPEN, BGP_ERR_OPN_HOLD_TIME);
                return 0;
            }
 
+           /* pick lowest hold time */
+           if (hold < peer->hold)
+               peer->hold = hold;
+
            /* adjust our keepalive based on negotiated hold value */
            if (peer->keepalive * 3 > peer->hold)
                peer->keepalive = peer->hold / 3;
            /* adjust our keepalive based on negotiated hold value */
            if (peer->keepalive * 3 > peer->hold)
                peer->keepalive = peer->hold / 3;