tcp: allow to enable the repair mode for non-listening sockets
authorAndrey Vagin <avagin@openvz.org>
Tue, 15 Nov 2016 02:15:14 +0000 (18:15 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Nov 2016 03:28:50 +0000 (22:28 -0500)
The repair mode is used to get and restore sequence numbers and
data from queues. It used to checkpoint/restore connections.

Currently the repair mode can be enabled for sockets in the established
and closed states, but for other states we have to dump the same socket
properties, so lets allow to enable repair mode for these sockets.

The repair mode reveals nothing more for sockets in other states.

Signed-off-by: Andrei Vagin <avagin@openvz.org>
Acked-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp.c

index b025a69ebd28ac0a1c59a7beac441abfa08b96b4..913f9bbfc030b0ff476e86f4c7983e896fda0c1c 100644 (file)
@@ -2300,7 +2300,7 @@ EXPORT_SYMBOL(tcp_disconnect);
 static inline bool tcp_can_repair_sock(const struct sock *sk)
 {
        return ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN) &&
-               ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_ESTABLISHED));
+               (sk->sk_state != TCP_LISTEN);
 }
 
 static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int len)