mirror of https://gitee.com/openkylin/linux.git
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:
commit
cd9d1a2332
|
@ -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);
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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, ¶ms, extack);
|
err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, ¶ms, 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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue