net: let flow have same hash in two directions
[ Upstream commit 1e60cebf82948cfdc9497ea4553bab125587593c ] 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: 64ae13ed4784 ("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);
|
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;
|
||||||
|
Reference in New Issue
Block a user