| From 42f0c2c0eb6dea13e1c2dda775477e2ce3156c73 Mon Sep 17 00:00:00 2001 |
| From: Petr Machata <petrm@mellanox.com> |
| Date: Mon, 18 Nov 2019 09:18:42 +0200 |
| Subject: [PATCH] mlxsw: spectrum_router: Fix determining underlay for a GRE |
| tunnel |
| |
| commit 1fc1657775dc1b19e9ac1d46b4054ed8ae5d99ab upstream. |
| |
| The helper mlxsw_sp_ipip_dev_ul_tb_id() determines the underlay VRF of a |
| GRE tunnel. For a tunnel without a bound device, it uses the same VRF that |
| the tunnel is in. However in Linux, a GRE tunnel without a bound device |
| uses the main VRF as the underlay. Fix the function accordingly. |
| |
| mlxsw further assumed that moving a tunnel to a different VRF could cause |
| conflict in local tunnel endpoint address, which cannot be offloaded. |
| However, the only way that an underlay could be changed by moving the |
| tunnel device itself is if the tunnel device does not have a bound device. |
| But in that case the underlay is always the main VRF, so there is no |
| opportunity to introduce a conflict by moving such device. Thus this check |
| constitutes a dead code, and can be removed, which do. |
| |
| Fixes: 6ddb7426a7d4 ("mlxsw: spectrum_router: Introduce loopback RIFs") |
| Signed-off-by: Petr Machata <petrm@mellanox.com> |
| Signed-off-by: Ido Schimmel <idosch@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c |
| index ef554739dd54..7f2d2857b5db 100644 |
| --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c |
| +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c |
| @@ -993,7 +993,7 @@ u32 mlxsw_sp_ipip_dev_ul_tb_id(const struct net_device *ol_dev) |
| if (d) |
| return l3mdev_fib_table(d) ? : RT_TABLE_MAIN; |
| else |
| - return l3mdev_fib_table(ol_dev) ? : RT_TABLE_MAIN; |
| + return RT_TABLE_MAIN; |
| } |
| |
| static struct mlxsw_sp_rif * |
| @@ -1597,27 +1597,10 @@ static int mlxsw_sp_netdevice_ipip_ol_vrf_event(struct mlxsw_sp *mlxsw_sp, |
| { |
| struct mlxsw_sp_ipip_entry *ipip_entry = |
| mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); |
| - enum mlxsw_sp_l3proto ul_proto; |
| - union mlxsw_sp_l3addr saddr; |
| - u32 ul_tb_id; |
| |
| if (!ipip_entry) |
| return 0; |
| |
| - /* For flat configuration cases, moving overlay to a different VRF might |
| - * cause local address conflict, and the conflicting tunnels need to be |
| - * demoted. |
| - */ |
| - ul_tb_id = mlxsw_sp_ipip_dev_ul_tb_id(ol_dev); |
| - ul_proto = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]->ul_proto; |
| - saddr = mlxsw_sp_ipip_netdev_saddr(ul_proto, ol_dev); |
| - if (mlxsw_sp_ipip_demote_tunnel_by_saddr(mlxsw_sp, ul_proto, |
| - saddr, ul_tb_id, |
| - ipip_entry)) { |
| - mlxsw_sp_ipip_entry_demote_tunnel(mlxsw_sp, ipip_entry); |
| - return 0; |
| - } |
| - |
| return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry, |
| true, false, false, extack); |
| } |
| -- |
| 2.7.4 |
| |