From f0f2496da01c0119e60a181aa9bcb604ff934d52 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Thu, 1 Dec 2016 11:32:31 +0300 Subject: [PATCH] tcp: add support for synsent libsoccr knows how to restore these sockets. travis-ci: success for series starting with [01/21] build: install libnet-dev Signed-off-by: Andrei Vagin Signed-off-by: Pavel Emelyanov --- criu/sk-inet.c | 1 + criu/sk-tcp.c | 8 ++++++-- criu/sockets.c | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/criu/sk-inet.c b/criu/sk-inet.c index 8217dc793..eb798ce38 100644 --- a/criu/sk-inet.c +++ b/criu/sk-inet.c @@ -170,6 +170,7 @@ static int can_dump_inet_sk(const struct inet_sk_desc *sk) case TCP_CLOSE_WAIT: case TCP_LAST_ACK: case TCP_CLOSING: + case TCP_SYN_SENT: if (!opts.tcp_established_ok) { pr_err("Connected TCP socket, consider using --%s option.\n", SK_EST_PARAM); diff --git a/criu/sk-tcp.c b/criu/sk-tcp.c index 391461da0..8179a351b 100644 --- a/criu/sk-tcp.c +++ b/criu/sk-tcp.c @@ -350,10 +350,14 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_ (void)data; - if (libsoccr_set_sk_data_noq(socr, &data, sizeof(data))) + /* + * O_NONBLOCK has to be set before libsoccr_set_sk_data_noq(), + * it is required to restore syn-sent sockets. + */ + if (restore_prepare_socket(sk)) goto err_c; - if (restore_prepare_socket(sk)) + if (libsoccr_set_sk_data_noq(socr, &data, sizeof(data))) goto err_c; if (restore_tcp_queues(socr, &data, img)) diff --git a/criu/sockets.c b/criu/sockets.c index 51927bfb6..a783be87a 100644 --- a/criu/sockets.c +++ b/criu/sockets.c @@ -648,7 +648,7 @@ int collect_sockets(struct ns_id *ns) req.r.i.idiag_states = (1 << TCP_LISTEN) | (1 << TCP_ESTABLISHED) | (1 << TCP_FIN_WAIT1) | (1 << TCP_FIN_WAIT2) | (1 << TCP_CLOSE_WAIT) | (1 << TCP_LAST_ACK) | - (1 << TCP_CLOSING); + (1 << TCP_CLOSING) | (1 << TCP_SYN_SENT); tmp = do_collect_req(nl, &req, sizeof(req), inet_receive_one, &req.r.i); if (tmp) err = tmp; @@ -679,7 +679,7 @@ int collect_sockets(struct ns_id *ns) req.r.i.idiag_states = (1 << TCP_LISTEN) | (1 << TCP_ESTABLISHED) | (1 << TCP_FIN_WAIT1) | (1 << TCP_FIN_WAIT2) | (1 << TCP_CLOSE_WAIT) | (1 << TCP_LAST_ACK) | - (1 << TCP_CLOSING); + (1 << TCP_CLOSING) | (1 << TCP_SYN_SENT); tmp = do_collect_req(nl, &req, sizeof(req), inet_receive_one, &req.r.i); if (tmp) err = tmp;