Check for expired timers even when receiving no events.

Signed-off-by: Benjamin Cama <benoar@dolka.fr>
This commit is contained in:
Benjamin Cama 2011-08-08 13:43:02 +02:00
parent ae7d3c9fca
commit 500eb6e594
3 changed files with 49 additions and 26 deletions

69
bgp.c
View file

@ -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,37 +827,53 @@ 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_send_notification(peer, BGP_ERR_HOLD_TIMER_EXP, 0);
continue;
}
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);
bgp_restart(peer);
}
bgp_process_timers(peer);
}
return 1;
}
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, "No message from BGP peer %s in %ds\n",
peer->name, peer->hold);
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);
bgp_restart(peer);
}
}
static void bgp_free_routes(struct bgp_route_list *routes)
{
struct bgp_route_list *tmp;

1
bgp.h
View file

@ -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;

View file

@ -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)
{