Commit 49aefd13 authored by suresh kumar's avatar suresh kumar Committed by David S. Miller

bonding: do not discard lowest hash bit for non layer3+4 hashing

Commit b5f86218 was introduced to discard lowest hash bit for layer3+4 hashing
but it also removes last bit from non layer3+4 hashing

Below script shows layer2+3 hashing will result in same slave to be used with above commit.
$ cat hash.py
#/usr/bin/python3.6

h_dests=[0xa0, 0xa1]
h_source=0xe3
hproto=0x8
saddr=0x1e7aa8c0
daddr=0x17aa8c0

for h_dest in h_dests:
    hash = (h_dest ^ h_source ^ hproto ^ saddr ^ daddr)
    hash ^= hash >> 16
    hash ^= hash >> 8
    print(hash)

print("with last bit removed")
for h_dest in h_dests:
    hash = (h_dest ^ h_source ^ hproto ^ saddr ^ daddr)
    hash ^= hash >> 16
    hash ^= hash >> 8
    hash = hash >> 1
    print(hash)

Output:
$ python3.6 hash.py
522133332
522133333   <-------------- will result in both slaves being used

with last bit removed
261066666
261066666   <-------------- only single slave used
Signed-off-by: default avatarsuresh kumar <suresh2514@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d08ed852
...@@ -4027,14 +4027,19 @@ static bool bond_flow_dissect(struct bonding *bond, struct sk_buff *skb, const v ...@@ -4027,14 +4027,19 @@ static bool bond_flow_dissect(struct bonding *bond, struct sk_buff *skb, const v
return true; return true;
} }
static u32 bond_ip_hash(u32 hash, struct flow_keys *flow) static u32 bond_ip_hash(u32 hash, struct flow_keys *flow, int xmit_policy)
{ {
hash ^= (__force u32)flow_get_u32_dst(flow) ^ hash ^= (__force u32)flow_get_u32_dst(flow) ^
(__force u32)flow_get_u32_src(flow); (__force u32)flow_get_u32_src(flow);
hash ^= (hash >> 16); hash ^= (hash >> 16);
hash ^= (hash >> 8); hash ^= (hash >> 8);
/* discard lowest hash bit to deal with the common even ports pattern */ /* discard lowest hash bit to deal with the common even ports pattern */
if (xmit_policy == BOND_XMIT_POLICY_LAYER34 ||
xmit_policy == BOND_XMIT_POLICY_ENCAP34)
return hash >> 1; return hash >> 1;
return hash;
} }
/* Generate hash based on xmit policy. If @skb is given it is used to linearize /* Generate hash based on xmit policy. If @skb is given it is used to linearize
...@@ -4064,7 +4069,7 @@ static u32 __bond_xmit_hash(struct bonding *bond, struct sk_buff *skb, const voi ...@@ -4064,7 +4069,7 @@ static u32 __bond_xmit_hash(struct bonding *bond, struct sk_buff *skb, const voi
memcpy(&hash, &flow.ports.ports, sizeof(hash)); memcpy(&hash, &flow.ports.ports, sizeof(hash));
} }
return bond_ip_hash(hash, &flow); return bond_ip_hash(hash, &flow, bond->params.xmit_policy);
} }
/** /**
...@@ -5259,7 +5264,7 @@ static u32 bond_sk_hash_l34(struct sock *sk) ...@@ -5259,7 +5264,7 @@ static u32 bond_sk_hash_l34(struct sock *sk)
/* L4 */ /* L4 */
memcpy(&hash, &flow.ports.ports, sizeof(hash)); memcpy(&hash, &flow.ports.ports, sizeof(hash));
/* L3 */ /* L3 */
return bond_ip_hash(hash, &flow); return bond_ip_hash(hash, &flow, BOND_XMIT_POLICY_LAYER34);
} }
static struct net_device *__bond_sk_get_lower_dev(struct bonding *bond, static struct net_device *__bond_sk_get_lower_dev(struct bonding *bond,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment