[CRIU] Re: [PATCH] tcp: restore rcv_wscale in a repair mode

Andrey Wagin avagin at gmail.com
Mon Sep 10 08:03:47 EDT 2012


2012/9/10 Pavel Emelyanov <xemul at parallels.com>:
> On 09/10/2012 03:54 PM, Andrew Vagin wrote:
>> rcv_wscale is a symetric parameter with snd_wscale.
>>
>> Both this parameters are set on a connection handshake.
>>
>> Without this valuea remote window size can't be interpreted correctly,
>> because a value from a packet should be shifted on rcv_wscale.
>>
>> And one more thing is that we should set wscale_ok too.
>>
>> This patch doesn't break a back compatibility, a rcv window
>> will be restored with the same bug (rcv_wscale = 0).
>>
>> Signed-off-by: Andrew Vagin <avagin at openvz.org>
>> ---
>>  net/ipv4/tcp.c |   20 ++++++++++++++++----
>>  1 files changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
>> index 2109ff4..70d995c 100644
>> --- a/net/ipv4/tcp.c
>> +++ b/net/ipv4/tcp.c
>> @@ -2325,10 +2325,22 @@ static int tcp_repair_options_est(struct tcp_sock *tp,
>>                       tp->rx_opt.mss_clamp = opt.opt_val;
>>                       break;
>>               case TCPOPT_WINDOW:
>> -                     if (opt.opt_val > 14)
>> -                             return -EFBIG;
>> -
>> -                     tp->rx_opt.snd_wscale = opt.opt_val;
>> +                     {
>> +                             union {
>> +                                     struct {
>> +                                             u16 snd_wscale;
>> +                                             u16 rcv_wscale;
>> +                                     };
>> +                                     u32 raw;
>> +                             } val = { .raw = opt.opt_val };
>
> Can we make it with bits shifts and masking?

Yes, we can. But when I show the variant with bit shifts and masking,
you did not like it;).
I know that you compared that variant with a new option for
rcv_wscale, but I decide to rework it and this one looks better for
me.

>
>> +
>> +                             if (val.snd_wscale > 14 || val.rcv_wscale > 14)
>> +                                     return -EFBIG;
>> +
>> +                             tp->rx_opt.snd_wscale = val.snd_wscale;
>> +                             tp->rx_opt.rcv_wscale = val.rcv_wscale;
>> +                             tp->rx_opt.wscale_ok = 1;
>> +                     }
>>                       break;
>>               case TCPOPT_SACK_PERM:
>>                       if (opt.opt_val != 0)
>


More information about the CRIU mailing list