| From f46010b917db41a3475f25295dde1bccc24d8ffa Mon Sep 17 00:00:00 2001 |
| From: Miaohe Lin <linmiaohe@huawei.com> |
| Date: Mon, 8 Apr 2019 10:04:20 +0800 |
| Subject: net: vrf: Fix ping failed when vrf mtu is set to 0 |
| |
| [ Upstream commit 5055376a3b44c4021de8830c9157f086a97731df ] |
| |
| When the mtu of a vrf device is set to 0, it would cause ping |
| failed. So I think we should limit vrf mtu in a reasonable range |
| to solve this problem. I set dev->min_mtu to IPV6_MIN_MTU, so it |
| will works for both ipv4 and ipv6. And if dev->max_mtu still be 0 |
| can be confusing, so I set dev->max_mtu to ETH_MAX_MTU. |
| |
| Here is the reproduce step: |
| |
| 1.Config vrf interface and set mtu to 0: |
| 3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel |
| master vrf1 state UP mode DEFAULT group default qlen 1000 |
| link/ether 52:54:00:9e:dd:c1 brd ff:ff:ff:ff:ff:ff |
| |
| 2.Ping peer: |
| 3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel |
| master vrf1 state UP group default qlen 1000 |
| link/ether 52:54:00:9e:dd:c1 brd ff:ff:ff:ff:ff:ff |
| inet 10.0.0.1/16 scope global enp4s0 |
| valid_lft forever preferred_lft forever |
| connect: Network is unreachable |
| |
| 3.Set mtu to default value, ping works: |
| PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. |
| 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=1.88 ms |
| |
| Fixes: ad49bc6361ca2 ("net: vrf: remove MTU limits for vrf device") |
| Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> |
| Reviewed-by: David Ahern <dsahern@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/vrf.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c |
| index 6d1a1abbed27..cd15c32b2e43 100644 |
| --- a/drivers/net/vrf.c |
| +++ b/drivers/net/vrf.c |
| @@ -1275,8 +1275,12 @@ static void vrf_setup(struct net_device *dev) |
| dev->priv_flags |= IFF_NO_QUEUE; |
| dev->priv_flags |= IFF_NO_RX_HANDLER; |
| |
| - dev->min_mtu = 0; |
| - dev->max_mtu = 0; |
| + /* VRF devices do not care about MTU, but if the MTU is set |
| + * too low then the ipv4 and ipv6 protocols are disabled |
| + * which breaks networking. |
| + */ |
| + dev->min_mtu = IPV6_MIN_MTU; |
| + dev->max_mtu = ETH_MAX_MTU; |
| } |
| |
| static int vrf_validate(struct nlattr *tb[], struct nlattr *data[], |
| -- |
| 2.19.1 |
| |