Message ID | 20191118071842.31712-1-idosch@idosch.org |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] mlxsw: spectrum_router: Fix determining underlay for a GRE tunnel | expand |
From: Ido Schimmel <idosch@idosch.org> Date: Mon, 18 Nov 2019 09:18:42 +0200 > From: Petr Machata <petrm@mellanox.com> > > 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> Applied and queued up for -stable.
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index a330b369e899..39d600c8b92d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -994,7 +994,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 * @@ -1598,27 +1598,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); }