Merge branch 'mlxsw-Various-fixes'

Ido Schimmel says:

====================
mlxsw: Various fixes

Patches #1 and #2 fix two VxLAN related issues. The first patch removes
warnings that can currently be triggered from user space. Second patch
avoids leaking a FID in an error path.

Patch #3 fixes a too strict check that causes certain host routes not to
be promoted to perform GRE decapsulation in hardware.

Last patch avoids a use-after-free when deleting a VLAN device via an
ioctl when it is enslaved to a bridge. I have a patchset for net-next
that reworks this code and makes the driver more robust.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2018-12-06 13:31:09 -08:00
commit cd9d1a2332
3 changed files with 16 additions and 10 deletions

View File

@ -560,7 +560,7 @@ static void mlxsw_sp_nve_mc_list_ip_del(struct mlxsw_sp *mlxsw_sp,
mc_record = mlxsw_sp_nve_mc_record_find(mc_list, proto, addr, mc_record = mlxsw_sp_nve_mc_record_find(mc_list, proto, addr,
&mc_entry); &mc_entry);
if (WARN_ON(!mc_record)) if (!mc_record)
return; return;
mlxsw_sp_nve_mc_record_entry_del(mc_record, mc_entry); mlxsw_sp_nve_mc_record_entry_del(mc_record, mc_entry);
@ -647,7 +647,7 @@ void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp,
key.fid_index = mlxsw_sp_fid_index(fid); key.fid_index = mlxsw_sp_fid_index(fid);
mc_list = mlxsw_sp_nve_mc_list_find(mlxsw_sp, &key); mc_list = mlxsw_sp_nve_mc_list_find(mlxsw_sp, &key);
if (WARN_ON(!mc_list)) if (!mc_list)
return; return;
mlxsw_sp_nve_fid_flood_index_clear(fid, mc_list); mlxsw_sp_nve_fid_flood_index_clear(fid, mc_list);

View File

@ -1275,15 +1275,12 @@ mlxsw_sp_ipip_entry_matches_decap(struct mlxsw_sp *mlxsw_sp,
{ {
u32 ul_tb_id = l3mdev_fib_table(ul_dev) ? : RT_TABLE_MAIN; u32 ul_tb_id = l3mdev_fib_table(ul_dev) ? : RT_TABLE_MAIN;
enum mlxsw_sp_ipip_type ipipt = ipip_entry->ipipt; enum mlxsw_sp_ipip_type ipipt = ipip_entry->ipipt;
struct net_device *ipip_ul_dev;
if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto) if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto)
return false; return false;
ipip_ul_dev = __mlxsw_sp_ipip_netdev_ul_dev_get(ipip_entry->ol_dev);
return mlxsw_sp_ipip_entry_saddr_matches(mlxsw_sp, ul_proto, ul_dip, return mlxsw_sp_ipip_entry_saddr_matches(mlxsw_sp, ul_proto, ul_dip,
ul_tb_id, ipip_entry) && ul_tb_id, ipip_entry);
(!ipip_ul_dev || ipip_ul_dev == ul_dev);
} }
/* Given decap parameters, find the corresponding IPIP entry. */ /* Given decap parameters, find the corresponding IPIP entry. */

View File

@ -296,7 +296,13 @@ static bool
mlxsw_sp_bridge_port_should_destroy(const struct mlxsw_sp_bridge_port * mlxsw_sp_bridge_port_should_destroy(const struct mlxsw_sp_bridge_port *
bridge_port) bridge_port)
{ {
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_port->dev); struct net_device *dev = bridge_port->dev;
struct mlxsw_sp *mlxsw_sp;
if (is_vlan_dev(dev))
mlxsw_sp = mlxsw_sp_lower_get(vlan_dev_real_dev(dev));
else
mlxsw_sp = mlxsw_sp_lower_get(dev);
/* In case ports were pulled from out of a bridged LAG, then /* In case ports were pulled from out of a bridged LAG, then
* it's possible the reference count isn't zero, yet the bridge * it's possible the reference count isn't zero, yet the bridge
@ -2109,7 +2115,7 @@ mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : 1; vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : 1;
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid); mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
if (WARN_ON(!mlxsw_sp_port_vlan)) if (!mlxsw_sp_port_vlan)
return; return;
mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan); mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
@ -2134,8 +2140,10 @@ mlxsw_sp_bridge_8021d_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
if (!fid) if (!fid)
return -EINVAL; return -EINVAL;
if (mlxsw_sp_fid_vni_is_set(fid)) if (mlxsw_sp_fid_vni_is_set(fid)) {
return -EINVAL; err = -EINVAL;
goto err_vni_exists;
}
err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack); err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack);
if (err) if (err)
@ -2149,6 +2157,7 @@ mlxsw_sp_bridge_8021d_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
return 0; return 0;
err_nve_fid_enable: err_nve_fid_enable:
err_vni_exists:
mlxsw_sp_fid_put(fid); mlxsw_sp_fid_put(fid);
return err; return err;
} }