From: Benjamin Cama Date: Mon, 8 Aug 2011 11:43:02 +0000 (+0200) Subject: Check for expired timers even when receiving no events. X-Git-Tag: debian/2.2.1-1fdn2~4^2 X-Git-Url: http://git.sameswireless.fr/l2tpns.git/commitdiff_plain/500eb6e594bcf6585828419322d0a61d7edc9f44?ds=sidebyside;hp=-c Check for expired timers even when receiving no events. Signed-off-by: Benjamin Cama --- 500eb6e594bcf6585828419322d0a61d7edc9f44 diff --git a/bgp.c b/bgp.c index 901ea55..04ff767 100644 --- 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 --- 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; diff --git a/l2tpns.c b/l2tpns.c index 61b2184..f2a60c9 100644 --- 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) {