Commit c2bf23e4 authored by Pieter Jansen van Vuuren's avatar Pieter Jansen van Vuuren Committed by Jakub Kicinski
Browse files

sfc: include vport_id in filter spec hash and equal()



Filters on different vports are qualified by different implicit MACs and/or
VLANs, so shouldn't be considered equal even if their other match fields
are identical.

Fixes: 7c460d9b ("sfc: Extend and abstract efx_filter_spec to cover Huntington/EF10")
Co-developed-by: default avatarEdward Cree <ecree.xilinx@gmail.com>
Signed-off-by: default avatarEdward Cree <ecree.xilinx@gmail.com>
Signed-off-by: default avatarPieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
Reviewed-by: default avatarMartin Habets <habetsm.xilinx@gmail.com>
Link: https://lore.kernel.org/r/20221018092841.32206-1-pieter.jansen-van-vuuren@amd.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d753a050
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -162,9 +162,9 @@ struct efx_filter_spec {
	u32	priority:2;
	u32	flags:6;
	u32	dmaq_id:12;
	u32	vport_id;
	u32	rss_context;
	__be16	outer_vid __aligned(4); /* allow jhash2() of match values */
	u32	vport_id;
	__be16	outer_vid;
	__be16	inner_vid;
	u8	loc_mac[ETH_ALEN];
	u8	rem_mac[ETH_ALEN];
+5 −5
Original line number Diff line number Diff line
@@ -660,17 +660,17 @@ bool efx_filter_spec_equal(const struct efx_filter_spec *left,
	     (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)))
		return false;

	return memcmp(&left->outer_vid, &right->outer_vid,
	return memcmp(&left->vport_id, &right->vport_id,
		      sizeof(struct efx_filter_spec) -
		      offsetof(struct efx_filter_spec, outer_vid)) == 0;
		      offsetof(struct efx_filter_spec, vport_id)) == 0;
}

u32 efx_filter_spec_hash(const struct efx_filter_spec *spec)
{
	BUILD_BUG_ON(offsetof(struct efx_filter_spec, outer_vid) & 3);
	return jhash2((const u32 *)&spec->outer_vid,
	BUILD_BUG_ON(offsetof(struct efx_filter_spec, vport_id) & 3);
	return jhash2((const u32 *)&spec->vport_id,
		      (sizeof(struct efx_filter_spec) -
		       offsetof(struct efx_filter_spec, outer_vid)) / 4,
		       offsetof(struct efx_filter_spec, vport_id)) / 4,
		      0);
}