2021-01-25 20:22:48

by Slava Bacherikov

[permalink] [raw]
Subject: BUG: Incorrect MTU on GRE device if remote is unspecified

Hi, I'd like to report a regression. Currently, if you create GRE
interface on the latest stable or LTS kernel (5.4 branch) with
unspecified remote destination it's MTU will be adjusted for header size
twice. For example:

$ ip link add name test type gre local 127.0.0.32
$ ip link show test | grep mtu
27: test@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group
default qlen 1000

or with FOU

$ ip link add name test2 type gre local 127.0.0.32 encap fou
encap-sport auto encap-dport 6666
$ ip link show test2 | grep mtu
28: test2@NONE: <NOARP> mtu 1436 qdisc noop state DOWN mode DEFAULT
group default qlen 1000

The same happens with GUE too (MTU is 1428 instead of 1464).
As you can see that MTU in first case is 1452 (1500 - 24 - 24) and with
FOU it's 1436 (1500 - 32 - 32), GUE 1428 (1500 - 36 - 36). If remote
address is specified MTU is correct.

This regression caused by fdafed459998e2be0e877e6189b24cb7a0183224 commit.


2021-01-28 01:01:33

by Jakub Kicinski

[permalink] [raw]
Subject: Re: BUG: Incorrect MTU on GRE device if remote is unspecified

On Mon, 25 Jan 2021 22:10:10 +0200 Slava Bacherikov wrote:
> Hi, I'd like to report a regression. Currently, if you create GRE
> interface on the latest stable or LTS kernel (5.4 branch) with
> unspecified remote destination it's MTU will be adjusted for header size
> twice. For example:
>
> $ ip link add name test type gre local 127.0.0.32
> $ ip link show test | grep mtu
> 27: test@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group
> default qlen 1000
>
> or with FOU
>
> $ ip link add name test2 type gre local 127.0.0.32 encap fou
> encap-sport auto encap-dport 6666
> $ ip link show test2 | grep mtu
> 28: test2@NONE: <NOARP> mtu 1436 qdisc noop state DOWN mode DEFAULT
> group default qlen 1000
>
> The same happens with GUE too (MTU is 1428 instead of 1464).
> As you can see that MTU in first case is 1452 (1500 - 24 - 24) and with
> FOU it's 1436 (1500 - 32 - 32), GUE 1428 (1500 - 36 - 36). If remote
> address is specified MTU is correct.
>
> This regression caused by fdafed459998e2be0e877e6189b24cb7a0183224 commit.

Cong is this one on your radar?

2021-01-28 01:42:10

by Cong Wang

[permalink] [raw]
Subject: Re: BUG: Incorrect MTU on GRE device if remote is unspecified

On Wed, Jan 27, 2021 at 4:56 PM Jakub Kicinski <[email protected]> wrote:
>
> On Mon, 25 Jan 2021 22:10:10 +0200 Slava Bacherikov wrote:
> > Hi, I'd like to report a regression. Currently, if you create GRE
> > interface on the latest stable or LTS kernel (5.4 branch) with
> > unspecified remote destination it's MTU will be adjusted for header size
> > twice. For example:
> >
> > $ ip link add name test type gre local 127.0.0.32
> > $ ip link show test | grep mtu
> > 27: test@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group
> > default qlen 1000
> >
> > or with FOU
> >
> > $ ip link add name test2 type gre local 127.0.0.32 encap fou
> > encap-sport auto encap-dport 6666
> > $ ip link show test2 | grep mtu
> > 28: test2@NONE: <NOARP> mtu 1436 qdisc noop state DOWN mode DEFAULT
> > group default qlen 1000
> >
> > The same happens with GUE too (MTU is 1428 instead of 1464).
> > As you can see that MTU in first case is 1452 (1500 - 24 - 24) and with
> > FOU it's 1436 (1500 - 32 - 32), GUE 1428 (1500 - 36 - 36). If remote
> > address is specified MTU is correct.
> >
> > This regression caused by fdafed459998e2be0e877e6189b24cb7a0183224 commit.
>
> Cong is this one on your radar?

Yeah, I guess ipgre_link_update() somehow gets called twice,
but I will need to look into it.

Thanks.

2021-01-28 02:26:25

by Vadim Fedorenko

[permalink] [raw]
Subject: Re: BUG: Incorrect MTU on GRE device if remote is unspecified

On 28.01.2021 01:38, Cong Wang wrote:
> On Wed, Jan 27, 2021 at 4:56 PM Jakub Kicinski <[email protected]> wrote:
>>
>> On Mon, 25 Jan 2021 22:10:10 +0200 Slava Bacherikov wrote:
>>> Hi, I'd like to report a regression. Currently, if you create GRE
>>> interface on the latest stable or LTS kernel (5.4 branch) with
>>> unspecified remote destination it's MTU will be adjusted for header size
>>> twice. For example:
>>>
>>> $ ip link add name test type gre local 127.0.0.32
>>> $ ip link show test | grep mtu
>>> 27: test@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group
>>> default qlen 1000
>>>
>>> or with FOU
>>>
>>> $ ip link add name test2 type gre local 127.0.0.32 encap fou
>>> encap-sport auto encap-dport 6666
>>> $ ip link show test2 | grep mtu
>>> 28: test2@NONE: <NOARP> mtu 1436 qdisc noop state DOWN mode DEFAULT
>>> group default qlen 1000
>>>
>>> The same happens with GUE too (MTU is 1428 instead of 1464).
>>> As you can see that MTU in first case is 1452 (1500 - 24 - 24) and with
>>> FOU it's 1436 (1500 - 32 - 32), GUE 1428 (1500 - 36 - 36). If remote
>>> address is specified MTU is correct.
>>>
>>> This regression caused by fdafed459998e2be0e877e6189b24cb7a0183224 commit.
>>
>> Cong is this one on your radar?
>
> Yeah, I guess ipgre_link_update() somehow gets called twice,
> but I will need to look into it.
>
> Thanks.
>

Hi!
The problem is in ip_tunnel_bind_dev() where mtu is set for tunnel device.

if (tdev) {
hlen = tdev->hard_header_len + tdev->needed_headroom;
mtu = min(tdev->mtu, IP_MAX_MTU);
}

dev->needed_headroom = t_hlen + hlen;
mtu -= (dev->hard_header_len + t_hlen);

ipgre_tunnel_init sets hard_header_len to tunnel->hlen + sizeof(*iph) and
ip_tunnel_bind_dev adds header overhead once again.

I'll post a patch a bit later but I need someone with extended tests.

Thanks