diff options
author | Jay Vosburgh <fubar@us.ibm.com> | 2005-06-26 17:54:11 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-26 17:54:11 -0400 |
commit | 169a3e66637c667b43dab7c319ffd5c99804cad8 (patch) | |
tree | f10f7c82ca44b871ae1391c5a3d35a65c463fc9b /drivers/net/bonding/bond_3ad.c | |
parent | c3ade5cad07f4d67f2e16a28f3c73d9483a55e0e (diff) |
bonding: xor/802.3ad improved slave hash
Add support for alternate slave selection algorithms to bonding
balance-xor and 802.3ad modes. Default mode (what we have now: xor of
MAC addresses) is "layer2", new choice is "layer3+4", using IP and port
information for hashing to select peer.
Originally submitted by Jason Gabler for balance-xor mode;
modified by Jay Vosburgh to additionally support 802.3ad mode. Jason's
original comment is as follows:
The attached patch to the Linux Etherchannel Bonding driver modifies the
driver's "balance-xor" mode as follows:
- alternate hashing policy support for mode 2
* Added kernel parameter "xmit_policy" to allow the specification
of different hashing policies for mode 2. The original mode 2
policy is the default, now found in xmit_hash_policy_layer2().
* Added xmit_hash_policy_layer34()
This patch was inspired by hashing policies implemented by Cisco,
Foundry and IBM, which are explained in
Foundry documentation found at:
http://www.foundrynet.com/services/documentation/sribcg/Trunking.html#112750
Signed-off-by: Jason Gabler <jygabler@lbl.gov>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Diffstat (limited to 'drivers/net/bonding/bond_3ad.c')
-rw-r--r-- | drivers/net/bonding/bond_3ad.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 6233c4ffb805..a2e8dda5afac 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
@@ -2346,7 +2346,6 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev) | |||
2346 | { | 2346 | { |
2347 | struct slave *slave, *start_at; | 2347 | struct slave *slave, *start_at; |
2348 | struct bonding *bond = dev->priv; | 2348 | struct bonding *bond = dev->priv; |
2349 | struct ethhdr *data = (struct ethhdr *)skb->data; | ||
2350 | int slave_agg_no; | 2349 | int slave_agg_no; |
2351 | int slaves_in_agg; | 2350 | int slaves_in_agg; |
2352 | int agg_id; | 2351 | int agg_id; |
@@ -2377,7 +2376,7 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev) | |||
2377 | goto out; | 2376 | goto out; |
2378 | } | 2377 | } |
2379 | 2378 | ||
2380 | slave_agg_no = (data->h_dest[5]^bond->dev->dev_addr[5]) % slaves_in_agg; | 2379 | slave_agg_no = bond->xmit_hash_policy(skb, dev, slaves_in_agg); |
2381 | 2380 | ||
2382 | bond_for_each_slave(bond, slave, i) { | 2381 | bond_for_each_slave(bond, slave, i) { |
2383 | struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; | 2382 | struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; |