[CRIU] [PATCH] tcp: check a state in refresh_inet_sk
    Andrey Vagin 
    avagin at openvz.org
       
    Fri Nov 16 10:02:31 EST 2012
    
    
  
A socket can get fin and a state will be changed on CLOSE_WAIT,
which is not supported yet.
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 sk-tcp.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
diff --git a/sk-tcp.c b/sk-tcp.c
index 17f5ab2..2cbdb90 100644
--- a/sk-tcp.c
+++ b/sk-tcp.c
@@ -54,6 +54,24 @@ static int tcp_repair_on(int fd)
 static int refresh_inet_sk(struct inet_sk_desc *sk)
 {
 	int size;
+	struct tcp_info info;
+
+	if (sk->state == TCP_CLOSE)
+		return 0;
+
+	if (dump_opt(sk->rfd, SOL_TCP, TCP_INFO, &info)) {
+		pr_perror("Failt to obtain TCP_INFO");
+		return -1;
+	}
+
+	switch (info.tcpi_state) {
+	case TCP_ESTABLISHED:
+	case TCP_CLOSE:
+		break;
+	default:
+		pr_err("Unknown state %d\n", sk->state);
+		return -1;
+	}
 
 	if (ioctl(sk->rfd, SIOCOUTQ, &size) == -1) {
 		pr_perror("Unable to get size of snd queue");
-- 
1.7.11.7
    
    
More information about the CRIU
mailing list