Check for expired timers even when receiving no events.
authorBenjamin Cama <benoar@dolka.fr>
Mon, 8 Aug 2011 11:43:02 +0000 (13:43 +0200)
committerBenjamin Cama <benoar@dolka.fr>
Mon, 8 Aug 2011 11:43:02 +0000 (13:43 +0200)
Signed-off-by: Benjamin Cama <benoar@dolka.fr>
bgp.c
bgp.h
l2tpns.c

diff --git a/bgp.c b/bgp.c
index 901ea55..04ff767 100644 (file)
--- a/bgp.c
+++ b/bgp.c
@@ -35,6 +35,7 @@ static struct bgp_route_list *bgp_insert_route(struct bgp_route_list *head,
 static struct bgp_route6_list *bgp_insert_route6(struct bgp_route6_list *head,
     struct bgp_route6_list *new);
 
+static void bgp_process_timers(struct bgp_peer *peer);
 static void bgp_free_routes(struct bgp_route_list *routes);
 static void bgp_free_routes6(struct bgp_route6_list *routes);
 static char const *bgp_msg_type_str(uint8_t type);
@@ -826,35 +827,51 @@ int bgp_process(uint32_t events[])
        }
 
        /* process timers */
-       if (peer->state == Established)
-       {
-           if (time_now > peer->expire_time)
-           {
-               LOG(1, 0, 0, "No message from BGP peer %s in %ds\n",
-                   peer->name, peer->hold);
+       bgp_process_timers(peer);
+    }
 
-               bgp_send_notification(peer, BGP_ERR_HOLD_TIMER_EXP, 0);
-               continue;
-           }
+    return 1;
+}
 
-           if (time_now > peer->keepalive_time && !peer->outbuf->packet.header.len)
-               bgp_send_keepalive(peer);
-       }
-       else if (peer->state == Idle)
-       {
-           if (time_now > peer->retry_time)
-               bgp_connect(peer);
-       }
-       else if (time_now > peer->state_time + BGP_STATE_TIME)
+void bgp_process_peers_timers()
+{
+    int i;
+
+    if (!bgp_configured)
+       return;
+
+    for (i = 0; i < BGP_NUM_PEERS; i++)
+       bgp_process_timers(&bgp_peers[i]);
+}
+
+static void bgp_process_timers(struct bgp_peer *peer)
+{
+    if (peer->state == Established)
+    {
+       if (time_now > peer->expire_time)
        {
-           LOG(1, 0, 0, "%s timer expired for BGP peer %s\n",
-               bgp_state_str(peer->state), peer->name);
+           LOG(1, 0, 0, "No message from BGP peer %s in %ds\n",
+               peer->name, peer->hold);
 
-           bgp_restart(peer);
+           bgp_send_notification(peer, BGP_ERR_HOLD_TIMER_EXP, 0);
+           return;
        }
+
+       if (time_now > peer->keepalive_time && !peer->outbuf->packet.header.len)
+           bgp_send_keepalive(peer);
+    }
+    else if (peer->state == Idle)
+    {
+       if (time_now > peer->retry_time)
+           bgp_connect(peer);
     }
+    else if (time_now > peer->state_time + BGP_STATE_TIME)
+    {
+       LOG(1, 0, 0, "%s timer expired for BGP peer %s\n",
+           bgp_state_str(peer->state), peer->name);
 
-    return 1;
+       bgp_restart(peer);
+    }
 }
 
 static void bgp_free_routes(struct bgp_route_list *routes)
diff --git a/bgp.h b/bgp.h
index bf429bd..44bad0d 100644 (file)
--- a/bgp.h
+++ b/bgp.h
@@ -278,6 +278,7 @@ int bgp_del_route6(struct in6_addr ip, int prefixlen);
 void bgp_enable_routing(int enable);
 int bgp_set_poll(void);
 int bgp_process(uint32_t events[]);
+void bgp_process_peers_timers();
 char const *bgp_state_str(enum bgp_state state);
 
 extern char const *cvs_id_bgp;
index 61b2184..f2a60c9 100644 (file)
--- a/l2tpns.c
+++ b/l2tpns.c
@@ -3769,6 +3769,11 @@ static void mainloop(void)
                                more++;
                        }
                }
+#ifdef BGP
+               else
+                       /* no event received, but timers could still have expired */
+                       bgp_process_peers_timers();
+#endif /* BGP */
 
                if (time_changed)
                {