[CRIU] [PATCH 08/21] soccr: move connect from criu to soccr

Andrei Vagin avagin at virtuozzo.com
Wed Nov 30 10:04:13 PST 2016


On Wed, Nov 30, 2016 at 12:16:50PM +0300, Pavel Emelyanov wrote:
> 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.

Ok

> 
> > +	 * 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?

Yes

> 
> >  	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