Fixes stuck connection during BGP session shutdown.
If TX buffers were full during BGP session shutdown then a protocol waited indefinitely to be able to send notification packet to close the session.
This commit is contained in:
parent
354496ace8
commit
48b15ef10f
1 changed files with 12 additions and 1 deletions
|
@ -384,10 +384,12 @@ bgp_conn_enter_close_state(struct bgp_conn *conn)
|
|||
int os = conn->state;
|
||||
|
||||
bgp_conn_set_state(conn, BS_CLOSE);
|
||||
tm_stop(conn->hold_timer);
|
||||
tm_stop(conn->keepalive_timer);
|
||||
conn->sk->rx_hook = NULL;
|
||||
|
||||
/* Timeout for CLOSE state, if we cannot send notification soon then we just hangup */
|
||||
bgp_start_timer(conn->hold_timer, 10);
|
||||
|
||||
if (os == BS_ESTABLISHED)
|
||||
bgp_conn_leave_established_state(p);
|
||||
}
|
||||
|
@ -478,9 +480,18 @@ static void
|
|||
bgp_hold_timeout(timer *t)
|
||||
{
|
||||
struct bgp_conn *conn = t->data;
|
||||
struct bgp_proto *p = conn->bgp;
|
||||
|
||||
DBG("BGP: Hold timeout\n");
|
||||
|
||||
/* We are already closing the connection - just do hangup */
|
||||
if (conn->state == BS_CLOSE)
|
||||
{
|
||||
BGP_TRACE(D_EVENTS, "Connection stalled");
|
||||
bgp_conn_enter_idle_state(conn);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If there is something in input queue, we are probably congested
|
||||
and perhaps just not processed BGP packets in time. */
|
||||
|
||||
|
|
Loading…
Reference in a new issue