mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-20 12:39:24 +07:00
bonding: Implement ndo_get_xmit_slave
Add implementation of ndo_get_xmit_slave. Find the slave by using the helper function according to the bond mode. If the caller set all_slaves to true, then it assumes that all slaves are available to transmit. Signed-off-by: Maor Gottlieb <maorg@mellanox.com> Reviewed-by: Jay Vosburgh <jay.vosburgh@canonical.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
6b447e76ed
commit
33720aaf8c
@ -4347,6 +4347,48 @@ static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
return txq;
|
||||
}
|
||||
|
||||
static struct net_device *bond_xmit_get_slave(struct net_device *master_dev,
|
||||
struct sk_buff *skb,
|
||||
bool all_slaves)
|
||||
{
|
||||
struct bonding *bond = netdev_priv(master_dev);
|
||||
struct bond_up_slave *slaves;
|
||||
struct slave *slave = NULL;
|
||||
|
||||
switch (BOND_MODE(bond)) {
|
||||
case BOND_MODE_ROUNDROBIN:
|
||||
slave = bond_xmit_roundrobin_slave_get(bond, skb);
|
||||
break;
|
||||
case BOND_MODE_ACTIVEBACKUP:
|
||||
slave = bond_xmit_activebackup_slave_get(bond, skb);
|
||||
break;
|
||||
case BOND_MODE_8023AD:
|
||||
case BOND_MODE_XOR:
|
||||
if (all_slaves)
|
||||
slaves = rcu_dereference(bond->all_slaves);
|
||||
else
|
||||
slaves = rcu_dereference(bond->usable_slaves);
|
||||
slave = bond_xmit_3ad_xor_slave_get(bond, skb, slaves);
|
||||
break;
|
||||
case BOND_MODE_BROADCAST:
|
||||
break;
|
||||
case BOND_MODE_ALB:
|
||||
slave = bond_xmit_alb_slave_get(bond, skb);
|
||||
break;
|
||||
case BOND_MODE_TLB:
|
||||
slave = bond_xmit_tlb_slave_get(bond, skb);
|
||||
break;
|
||||
default:
|
||||
/* Should never happen, mode already checked */
|
||||
WARN_ONCE(true, "Unknown bonding mode");
|
||||
break;
|
||||
}
|
||||
|
||||
if (slave)
|
||||
return slave->dev;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct bonding *bond = netdev_priv(dev);
|
||||
@ -4468,6 +4510,7 @@ static const struct net_device_ops bond_netdev_ops = {
|
||||
.ndo_del_slave = bond_release,
|
||||
.ndo_fix_features = bond_fix_features,
|
||||
.ndo_features_check = passthru_features_check,
|
||||
.ndo_get_xmit_slave = bond_xmit_get_slave,
|
||||
};
|
||||
|
||||
static const struct device_type bond_type = {
|
||||
|
Loading…
Reference in New Issue
Block a user