Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd9d1a23 authored by David S. Miller's avatar David S. Miller
Browse files

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: default avatarDavid S. Miller <davem@davemloft.net>
parents ebaf39e6 993107fe
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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_entry);
	if (WARN_ON(!mc_record))
	if (!mc_record)
		return;

	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);
	mc_list = mlxsw_sp_nve_mc_list_find(mlxsw_sp, &key);
	if (WARN_ON(!mc_list))
	if (!mc_list)
		return;

	mlxsw_sp_nve_fid_flood_index_clear(fid, mc_list);
+1 −4
Original line number Diff line number Diff line
@@ -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;
	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)
		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,
						 ul_tb_id, ipip_entry) &&
	       (!ipip_ul_dev || ipip_ul_dev == ul_dev);
						 ul_tb_id, ipip_entry);
}

/* Given decap parameters, find the corresponding IPIP entry. */
+13 −4
Original line number Diff line number Diff line
@@ -296,7 +296,13 @@ static bool
mlxsw_sp_bridge_port_should_destroy(const struct mlxsw_sp_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
	 * 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;
	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;

	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)
		return -EINVAL;

	if (mlxsw_sp_fid_vni_is_set(fid))
		return -EINVAL;
	if (mlxsw_sp_fid_vni_is_set(fid)) {
		err = -EINVAL;
		goto err_vni_exists;
	}

	err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack);
	if (err)
@@ -2149,6 +2157,7 @@ mlxsw_sp_bridge_8021d_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
	return 0;

err_nve_fid_enable:
err_vni_exists:
	mlxsw_sp_fid_put(fid);
	return err;
}