sfc: include vport_id in filter spec hash and equal()
[ Upstream commit c2bf23e4a5af37a4d77901d9ff14c50a269f143d ]
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: 7c460d9be6
("sfc: Extend and abstract efx_filter_spec to cover Huntington/EF10")
Co-developed-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Pieter Jansen van Vuuren <pieter.jansen-van-vuuren@amd.com>
Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
Link: https://lore.kernel.org/r/20221018092841.32206-1-pieter.jansen-van-vuuren@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
ded86c4191
commit
3032e316e0
@@ -157,7 +157,8 @@ struct efx_filter_spec {
|
|||||||
u32 flags:6;
|
u32 flags:6;
|
||||||
u32 dmaq_id:12;
|
u32 dmaq_id:12;
|
||||||
u32 rss_context;
|
u32 rss_context;
|
||||||
__be16 outer_vid __aligned(4); /* allow jhash2() of match values */
|
u32 vport_id;
|
||||||
|
__be16 outer_vid;
|
||||||
__be16 inner_vid;
|
__be16 inner_vid;
|
||||||
u8 loc_mac[ETH_ALEN];
|
u8 loc_mac[ETH_ALEN];
|
||||||
u8 rem_mac[ETH_ALEN];
|
u8 rem_mac[ETH_ALEN];
|
||||||
|
@@ -676,17 +676,17 @@ bool efx_filter_spec_equal(const struct efx_filter_spec *left,
|
|||||||
(EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)))
|
(EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return memcmp(&left->outer_vid, &right->outer_vid,
|
return memcmp(&left->vport_id, &right->vport_id,
|
||||||
sizeof(struct efx_filter_spec) -
|
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)
|
u32 efx_filter_spec_hash(const struct efx_filter_spec *spec)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(offsetof(struct efx_filter_spec, outer_vid) & 3);
|
BUILD_BUG_ON(offsetof(struct efx_filter_spec, vport_id) & 3);
|
||||||
return jhash2((const u32 *)&spec->outer_vid,
|
return jhash2((const u32 *)&spec->vport_id,
|
||||||
(sizeof(struct efx_filter_spec) -
|
(sizeof(struct efx_filter_spec) -
|
||||||
offsetof(struct efx_filter_spec, outer_vid)) / 4,
|
offsetof(struct efx_filter_spec, vport_id)) / 4,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user