[CRIU] [PATCH 08/21] soccr: move connect from criu to soccr
Pavel Emelyanov
xemul at virtuozzo.com
Wed Nov 30 01:16:50 PST 2016
On 11/28/2016 10:27 PM, Andrei Vagin wrote:
> From: Andrei Vagin <avagin at virtuozzo.com>
>
> We will need to disable the repair mode before connect()
> to restore syn-sent sockets. And even now connect() looks
> like a part of internal logic of libsoccr.
>
> Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
> ---
> criu/sk-inet.c | 20 ++++++++++----------
> criu/sk-tcp.c | 9 ---------
> soccr/soccr.c | 30 ++++++++++++++++--------------
> 3 files changed, 26 insertions(+), 33 deletions(-)
>
> diff --git a/criu/sk-inet.c b/criu/sk-inet.c
> index 30e7fa6..987217d 100644
> --- a/criu/sk-inet.c
> +++ b/criu/sk-inet.c
> @@ -592,6 +592,16 @@ static int open_inet_sk(struct file_desc *d)
> if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &yes))
> goto err;
>
> + /*
> + * Listen sockets are easiest ones -- simply
Comment is worth being fixed, as it now binds not only listening sockets.
> + * bind() and listen(), and that's all.
> + */
> +
> + if (ie->src_port) {
> + if (inet_bind(sk, ii))
> + goto err;
> + }
> +
Can we repair-on the bound socket?
> if (tcp_connection(ie)) {
> if (!opts.tcp_established_ok) {
> pr_err("Connected TCP socket in image\n");
> @@ -608,16 +618,6 @@ static int open_inet_sk(struct file_desc *d)
> goto done;
> }
>
> - /*
> - * Listen sockets are easiest ones -- simply
> - * bind() and listen(), and that's all.
> - */
> -
> - if (ie->src_port) {
> - if (inet_bind(sk, ii))
> - goto err;
> - }
> -
> if (ie->state == TCP_LISTEN) {
> if (ie->proto != IPPROTO_TCP) {
> pr_err("Wrong socket in listen state %d\n", ie->proto);
> diff --git a/criu/sk-tcp.c b/criu/sk-tcp.c
> index d08a4c0..bfe26c1 100644
> --- a/criu/sk-tcp.c
> +++ b/criu/sk-tcp.c
> @@ -349,15 +349,6 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_
>
> (void)data;
>
> - if (libsoccr_set_sk_data_unbound(socr, &data, sizeof(data)))
> - goto err_c;
Good :) Please, remove this function from uapi header as well.
> -
> - if (inet_bind(sk, ii))
> - goto err_c;
> -
> - if (inet_connect(sk, ii))
> - goto err_c;
> -
> if (libsoccr_set_sk_data_noq(socr, &data, sizeof(data)))
> goto err_c;
>
> diff --git a/soccr/soccr.c b/soccr/soccr.c
> index 019eeea..31cb870 100644
> --- a/soccr/soccr.c
> +++ b/soccr/soccr.c
> @@ -323,9 +323,17 @@ static int set_queue_seq(struct libsoccr_sk *sk, int queue, __u32 seq)
> return 0;
> }
>
> -int libsoccr_set_sk_data_unbound(struct libsoccr_sk *sk,
> +#ifndef TCPOPT_SACK_PERM
> +#define TCPOPT_SACK_PERM TCPOPT_SACK_PERMITTED
> +#endif
> +
> +int libsoccr_set_sk_data_noq(struct libsoccr_sk *sk,
> struct libsoccr_sk_data *data, unsigned data_size)
> {
> + struct tcp_repair_opt opts[4];
> + int addr_size;
> + int onr = 0;
> +
> if (!data || data_size < SOCR_DATA_MIN_SIZE)
> return -1;
>
> @@ -339,21 +347,15 @@ int libsoccr_set_sk_data_unbound(struct libsoccr_sk *sk,
> data->outq_seq - data->outq_len))
> return -3;
>
> - return 0;
> -}
> -
> -#ifndef TCPOPT_SACK_PERM
> -#define TCPOPT_SACK_PERM TCPOPT_SACK_PERMITTED
> -#endif
> + if (data->dst_addr.sa.sa_family == AF_INET)
> + addr_size = sizeof(data->dst_addr.sin);
> + else
> + addr_size = sizeof(data->dst_addr.sin6);
>
> -int libsoccr_set_sk_data_noq(struct libsoccr_sk *sk,
> - struct libsoccr_sk_data *data, unsigned data_size)
> -{
> - struct tcp_repair_opt opts[4];
> - int onr = 0;
> -
> - if (!data || data_size < SOCR_DATA_MIN_SIZE)
> + if (connect(sk->fd, &data->dst_addr.sa, addr_size) == -1) {
> + loge("Can't connect inet socket back\n");
> return -1;
> + }
>
> logd("\tRestoring TCP options\n");
>
>
More information about the CRIU
mailing list