[CRIU] [PATCH] tcp: allow to repair the FIN_WAIT2 state
Andrew Vagin
avagin at parallels.com
Tue Mar 25 06:45:49 PDT 2014
On Tue, Mar 25, 2014 at 05:34:38PM +0400, Pavel Emelyanov wrote:
> On 03/25/2014 04:58 PM, Andrey Vagin wrote:
> > A socket in the FIN_WAIT2 state doesn't have unacknowledged data in a
> > queue. We don't need to send anything back and can restore it directly.
> >
> > This state allows us to restore socket in the TIME_WAIT state. For that
> > we need to set the FIN_WAIT2 state and send the fin packet in a received
> > queue.
> >
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> > ---
> > include/uapi/linux/tcp.h | 1 +
> > net/ipv4/tcp.c | 10 ++++++++++
> > 2 files changed, 11 insertions(+)
> >
> > diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h
> > index b1d5973..d9f7970 100644
> > --- a/include/uapi/linux/tcp.h
> > +++ b/include/uapi/linux/tcp.h
> > @@ -201,5 +201,6 @@ struct tcp_md5sig {
> >
> > /* Control message types to repair tcp connections */
> > #define TCP_REPAIR_SEND_FIN 1
> > +#define TCP_REPAIR_FIN_WAIT2 2
> >
> > #endif /* _UAPI_LINUX_TCP_H */
> > diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
> > index d196598..5345980 100644
> > --- a/net/ipv4/tcp.c
> > +++ b/net/ipv4/tcp.c
> > @@ -1090,6 +1090,16 @@ static int tcp_repair_cmsg(struct sock *sk, struct msghdr *msg)
> > else
> > return -EINVAL;
> > break;
> > +
> > + case TCP_REPAIR_FIN_WAIT2:
>
> Это какой-то странный "пакет". Мне так не нравится. Надо думать.
Это не пакет. Мы явно переводим сокет в это состояние. У меня тоже есть
сомнения по поводу этого метода, по этому я для начала заслал его вам.
Я сегодня долго смотрел в этот код. У меня была идея слать ack-и в
очереди, но получается как-то не очень. Этот вариант мне понравился
больше. Главное, что это такое законченое состояние, что там не надо
ничего посылать наружу, и соответсвенно его можно просто выставить (или
нельзя?).
>
> > + if (tp->repair_queue != TCP_SEND_QUEUE ||
> > + sk->sk_state != TCP_ESTABLISHED ||
> > + tp->snd_una != tp->write_seq)
> > + return -EINVAL;
> > +
> > + tcp_set_state(sk, TCP_FIN_WAIT2);
> > +
> > + break;
> > default:
> > return -EINVAL;
> > }
> >
>
>
More information about the CRIU
mailing list