mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
net: let flow have same hash in two directions
[ Upstream commit1e60cebf82] using same source and destination ip/port for flow hash calculation within the two directions. Signed-off-by: zhang kai <zhangkaiheb@126.com> Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of:64ae13ed47("net: core: fix flow symmetric hash") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
ab4a733874
commit
e90001e1dd
|
|
@ -1485,7 +1485,7 @@ __be32 flow_get_u32_dst(const struct flow_keys *flow)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(flow_get_u32_dst);
|
EXPORT_SYMBOL(flow_get_u32_dst);
|
||||||
|
|
||||||
/* Sort the source and destination IP (and the ports if the IP are the same),
|
/* Sort the source and destination IP and the ports,
|
||||||
* to have consistent hash within the two directions
|
* to have consistent hash within the two directions
|
||||||
*/
|
*/
|
||||||
static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||||
|
|
@ -1496,11 +1496,11 @@ static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||||
case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
|
case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
|
||||||
addr_diff = (__force u32)keys->addrs.v4addrs.dst -
|
addr_diff = (__force u32)keys->addrs.v4addrs.dst -
|
||||||
(__force u32)keys->addrs.v4addrs.src;
|
(__force u32)keys->addrs.v4addrs.src;
|
||||||
if ((addr_diff < 0) ||
|
if (addr_diff < 0)
|
||||||
(addr_diff == 0 &&
|
|
||||||
((__force u16)keys->ports.dst <
|
|
||||||
(__force u16)keys->ports.src))) {
|
|
||||||
swap(keys->addrs.v4addrs.src, keys->addrs.v4addrs.dst);
|
swap(keys->addrs.v4addrs.src, keys->addrs.v4addrs.dst);
|
||||||
|
|
||||||
|
if ((__force u16)keys->ports.dst <
|
||||||
|
(__force u16)keys->ports.src) {
|
||||||
swap(keys->ports.src, keys->ports.dst);
|
swap(keys->ports.src, keys->ports.dst);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -1508,13 +1508,13 @@ static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||||
addr_diff = memcmp(&keys->addrs.v6addrs.dst,
|
addr_diff = memcmp(&keys->addrs.v6addrs.dst,
|
||||||
&keys->addrs.v6addrs.src,
|
&keys->addrs.v6addrs.src,
|
||||||
sizeof(keys->addrs.v6addrs.dst));
|
sizeof(keys->addrs.v6addrs.dst));
|
||||||
if ((addr_diff < 0) ||
|
if (addr_diff < 0) {
|
||||||
(addr_diff == 0 &&
|
|
||||||
((__force u16)keys->ports.dst <
|
|
||||||
(__force u16)keys->ports.src))) {
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
swap(keys->addrs.v6addrs.src.s6_addr32[i],
|
swap(keys->addrs.v6addrs.src.s6_addr32[i],
|
||||||
keys->addrs.v6addrs.dst.s6_addr32[i]);
|
keys->addrs.v6addrs.dst.s6_addr32[i]);
|
||||||
|
}
|
||||||
|
if ((__force u16)keys->ports.dst <
|
||||||
|
(__force u16)keys->ports.src) {
|
||||||
swap(keys->ports.src, keys->ports.dst);
|
swap(keys->ports.src, keys->ports.dst);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user