Merge branch 'fdn-mods'

This commit is contained in:
Benjamin Cama 2011-08-08 13:43:42 +02:00
commit 7d862d168f
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, static struct bgp_route6_list *bgp_insert_route6(struct bgp_route6_list *head,
struct bgp_route6_list *new); 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_routes(struct bgp_route_list *routes);
static void bgp_free_routes6(struct bgp_route6_list *routes); static void bgp_free_routes6(struct bgp_route6_list *routes);
static char const *bgp_msg_type_str(uint8_t type); static char const *bgp_msg_type_str(uint8_t type);
@ -826,37 +827,53 @@ int bgp_process(uint32_t events[])
} }
/* process timers */ /* process timers */
if (peer->state == Established) bgp_process_timers(peer);
{
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);
}
} }
return 1; 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) static void bgp_free_routes(struct bgp_route_list *routes)
{ {
struct bgp_route_list *tmp; 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); void bgp_enable_routing(int enable);
int bgp_set_poll(void); int bgp_set_poll(void);
int bgp_process(uint32_t events[]); int bgp_process(uint32_t events[]);
void bgp_process_peers_timers();
char const *bgp_state_str(enum bgp_state state); char const *bgp_state_str(enum bgp_state state);
extern char const *cvs_id_bgp; extern char const *cvs_id_bgp;

View file

@ -3769,6 +3769,11 @@ static void mainloop(void)
more++; more++;
} }
} }
#ifdef BGP
else
/* no event received, but timers could still have expired */
bgp_process_peers_timers();
#endif /* BGP */
if (time_changed) if (time_changed)
{ {