You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08: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:
committed by
Greg Kroah-Hartman
parent
ab4a733874
commit
e90001e1dd
@@ -1485,7 +1485,7 @@ __be32 flow_get_u32_dst(const struct flow_keys *flow)
|
||||
}
|
||||
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
|
||||
*/
|
||||
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:
|
||||
addr_diff = (__force u32)keys->addrs.v4addrs.dst -
|
||||
(__force u32)keys->addrs.v4addrs.src;
|
||||
if ((addr_diff < 0) ||
|
||||
(addr_diff == 0 &&
|
||||
((__force u16)keys->ports.dst <
|
||||
(__force u16)keys->ports.src))) {
|
||||
if (addr_diff < 0)
|
||||
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);
|
||||
}
|
||||
break;
|
||||
@@ -1508,13 +1508,13 @@ static inline void __flow_hash_consistentify(struct flow_keys *keys)
|
||||
addr_diff = memcmp(&keys->addrs.v6addrs.dst,
|
||||
&keys->addrs.v6addrs.src,
|
||||
sizeof(keys->addrs.v6addrs.dst));
|
||||
if ((addr_diff < 0) ||
|
||||
(addr_diff == 0 &&
|
||||
((__force u16)keys->ports.dst <
|
||||
(__force u16)keys->ports.src))) {
|
||||
if (addr_diff < 0) {
|
||||
for (i = 0; i < 4; i++)
|
||||
swap(keys->addrs.v6addrs.src.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);
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user