Skip to content

Commit

Permalink
tcp: Reset tcp connections in SYN-SENT state
Browse files Browse the repository at this point in the history
Userspace sends tcp connection (sock) destroy on network switch
i.e switching the default network of the device between multiple
networks(Cellular/Wifi/Ethernet).

Kernel though doesn't send reset for the connections in SYN-SENT state
and these connections continue to remain.
Even as per RFC 793, there is no hard rule to not send RST on ABORT in
this state.

Modify tcp_abort and tcp_disconnect behavior to send RST for connections
in syn-sent state to avoid lingering connections on network switch.

Signed-off-by: Manoj Basapathi <manojbm@codeaurora.org>
Signed-off-by: Sauvik Saha <ssaha@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Manoj Basapathi authored and David S. Miller committed Apr 6, 2021
1 parent cc0626c commit e880f8b
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions net/ipv4/tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -2888,7 +2888,7 @@ static inline bool tcp_need_reset(int state)
{
return (1 << state) &
(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT | TCPF_FIN_WAIT1 |
TCPF_FIN_WAIT2 | TCPF_SYN_RECV);
TCPF_FIN_WAIT2 | TCPF_SYN_RECV | TCPF_SYN_SENT);
}

static void tcp_rtx_queue_purge(struct sock *sk)
Expand Down Expand Up @@ -2954,8 +2954,7 @@ int tcp_disconnect(struct sock *sk, int flags)
*/
tcp_send_active_reset(sk, gfp_any());
sk->sk_err = ECONNRESET;
} else if (old_state == TCP_SYN_SENT)
sk->sk_err = ECONNRESET;
}

tcp_clear_xmit_timers(sk);
__skb_queue_purge(&sk->sk_receive_queue);
Expand Down

0 comments on commit e880f8b

Please sign in to comment.