bonding: add a vlan+srcmac tx hashing option
authorJarod Wilson <jarod@redhat.com>
Tue, 19 Jan 2021 01:09:27 +0000 (20:09 -0500)
committerJakub Kicinski <kuba@kernel.org>
Wed, 20 Jan 2021 03:30:32 +0000 (19:30 -0800)
commit7b8fc0103bb51d1d3e1fb5fd67958612e709f883
treea270badd5579c8e8f7c4bfdc98d23a2835fecc4a
parent00b229f762b020eebf55a52b984aec76ae0ad966
bonding: add a vlan+srcmac tx hashing option

This comes from an end-user request, where they're running multiple VMs on
hosts with bonded interfaces connected to some interest switch topologies,
where 802.3ad isn't an option. They're currently running a proprietary
solution that effectively achieves load-balancing of VMs and bandwidth
utilization improvements with a similar form of transmission algorithm.

Basically, each VM has it's own vlan, so it always sends its traffic out
the same interface, unless that interface fails. Traffic gets split
between the interfaces, maintaining a consistent path, with failover still
available if an interface goes down.

Unlike bond_eth_hash(), this hash function is using the full source MAC
address instead of just the last byte, as there are so few components to
the hash, and in the no-vlan case, we would be returning just the last
byte of the source MAC as the hash value. It's entirely possible to have
two NICs in a bond with the same last byte of their MAC, but not the same
MAC, so this adjustment should guarantee distinct hashes in all cases.

This has been rudimetarily tested to provide similar results to the
proprietary solution it is aiming to replace. A patch for iproute2 is also
posted, to properly support the new mode there as well.

Cc: Jay Vosburgh <j.vosburgh@gmail.com>
Cc: Veaceslav Falico <vfalico@gmail.com>
Cc: Andy Gospodarek <andy@greyhouse.net>
Cc: Thomas Davis <tadavis@lbl.gov>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Link: https://lore.kernel.org/r/20210119010927.1191922-1-jarod@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/networking/bonding.rst
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_options.c
include/linux/netdevice.h
include/uapi/linux/if_bonding.h