Merge branch 'bonding-next'
Veaceslav Falico says: ==================== bonding: simple macro cleanup Trivial patchset that converts most of the bonding's macros into inline functions. It introduces only one macro, BOND_MODE(), which is just bond->params.mode, better to write/understand/remember. The only real change is the removal of IFF_UP verification, which always came in pair with && netif_running(), and is though useless, as it's always IFF_UP when LINK_STATE_RUNNING. v2->v3: fix 3/9 to actually invert bond_mode_uses_arp() and add bond_uses_arp() alongside bond_mode_uses_arp() v1->v2: use inlined functions instead of macros. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
bd50806574
@ -192,7 +192,7 @@ static inline void __enable_port(struct port *port)
|
|||||||
{
|
{
|
||||||
struct slave *slave = port->slave;
|
struct slave *slave = port->slave;
|
||||||
|
|
||||||
if ((slave->link == BOND_LINK_UP) && IS_UP(slave->dev))
|
if ((slave->link == BOND_LINK_UP) && bond_slave_is_up(slave))
|
||||||
bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER);
|
bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2449,13 +2449,13 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (slave_agg_no >= 0) {
|
if (slave_agg_no >= 0) {
|
||||||
if (!first_ok_slave && SLAVE_IS_OK(slave))
|
if (!first_ok_slave && bond_slave_can_tx(slave))
|
||||||
first_ok_slave = slave;
|
first_ok_slave = slave;
|
||||||
slave_agg_no--;
|
slave_agg_no--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SLAVE_IS_OK(slave)) {
|
if (bond_slave_can_tx(slave)) {
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ static struct slave *tlb_get_least_loaded_slave(struct bonding *bond)
|
|||||||
|
|
||||||
/* Find the slave with the largest gap */
|
/* Find the slave with the largest gap */
|
||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (SLAVE_IS_OK(slave)) {
|
if (bond_slave_can_tx(slave)) {
|
||||||
long long gap = compute_gap(slave);
|
long long gap = compute_gap(slave);
|
||||||
|
|
||||||
if (max_gap < gap) {
|
if (max_gap < gap) {
|
||||||
@ -383,7 +383,7 @@ static struct slave *rlb_next_rx_slave(struct bonding *bond)
|
|||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave(bond, slave, iter) {
|
||||||
if (!SLAVE_IS_OK(slave))
|
if (!bond_slave_can_tx(slave))
|
||||||
continue;
|
continue;
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if (!before || before->speed < slave->speed)
|
if (!before || before->speed < slave->speed)
|
||||||
@ -416,7 +416,7 @@ static struct slave *__rlb_next_rx_slave(struct bonding *bond)
|
|||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (!SLAVE_IS_OK(slave))
|
if (!bond_slave_can_tx(slave))
|
||||||
continue;
|
continue;
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if (!before || before->speed < slave->speed)
|
if (!before || before->speed < slave->speed)
|
||||||
@ -1057,7 +1057,7 @@ static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[])
|
|||||||
struct net_device *dev = slave->dev;
|
struct net_device *dev = slave->dev;
|
||||||
struct sockaddr s_addr;
|
struct sockaddr s_addr;
|
||||||
|
|
||||||
if (slave->bond->params.mode == BOND_MODE_TLB) {
|
if (BOND_MODE(slave->bond) == BOND_MODE_TLB) {
|
||||||
memcpy(dev->dev_addr, addr, dev->addr_len);
|
memcpy(dev->dev_addr, addr, dev->addr_len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1100,13 +1100,13 @@ static void alb_swap_mac_addr(struct slave *slave1, struct slave *slave2)
|
|||||||
static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
|
static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
|
||||||
struct slave *slave2)
|
struct slave *slave2)
|
||||||
{
|
{
|
||||||
int slaves_state_differ = (SLAVE_IS_OK(slave1) != SLAVE_IS_OK(slave2));
|
int slaves_state_differ = (bond_slave_can_tx(slave1) != bond_slave_can_tx(slave2));
|
||||||
struct slave *disabled_slave = NULL;
|
struct slave *disabled_slave = NULL;
|
||||||
|
|
||||||
ASSERT_RTNL();
|
ASSERT_RTNL();
|
||||||
|
|
||||||
/* fasten the change in the switch */
|
/* fasten the change in the switch */
|
||||||
if (SLAVE_IS_OK(slave1)) {
|
if (bond_slave_can_tx(slave1)) {
|
||||||
alb_send_learning_packets(slave1, slave1->dev->dev_addr);
|
alb_send_learning_packets(slave1, slave1->dev->dev_addr);
|
||||||
if (bond->alb_info.rlb_enabled) {
|
if (bond->alb_info.rlb_enabled) {
|
||||||
/* inform the clients that the mac address
|
/* inform the clients that the mac address
|
||||||
@ -1118,7 +1118,7 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
|
|||||||
disabled_slave = slave1;
|
disabled_slave = slave1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SLAVE_IS_OK(slave2)) {
|
if (bond_slave_can_tx(slave2)) {
|
||||||
alb_send_learning_packets(slave2, slave2->dev->dev_addr);
|
alb_send_learning_packets(slave2, slave2->dev->dev_addr);
|
||||||
if (bond->alb_info.rlb_enabled) {
|
if (bond->alb_info.rlb_enabled) {
|
||||||
/* inform the clients that the mac address
|
/* inform the clients that the mac address
|
||||||
@ -1360,7 +1360,7 @@ static int bond_do_alb_xmit(struct sk_buff *skb, struct bonding *bond,
|
|||||||
bond_info->unbalanced_load += skb->len;
|
bond_info->unbalanced_load += skb->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx_slave && SLAVE_IS_OK(tx_slave)) {
|
if (tx_slave && bond_slave_can_tx(tx_slave)) {
|
||||||
if (tx_slave != rcu_dereference(bond->curr_active_slave)) {
|
if (tx_slave != rcu_dereference(bond->curr_active_slave)) {
|
||||||
ether_addr_copy(eth_data->h_source,
|
ether_addr_copy(eth_data->h_source,
|
||||||
tx_slave->dev->dev_addr);
|
tx_slave->dev->dev_addr);
|
||||||
@ -1745,7 +1745,7 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
|
|||||||
/* in TLB mode, the slave might flip down/up with the old dev_addr,
|
/* in TLB mode, the slave might flip down/up with the old dev_addr,
|
||||||
* and thus filter bond->dev_addr's packets, so force bond's mac
|
* and thus filter bond->dev_addr's packets, so force bond's mac
|
||||||
*/
|
*/
|
||||||
if (bond->params.mode == BOND_MODE_TLB) {
|
if (BOND_MODE(bond) == BOND_MODE_TLB) {
|
||||||
struct sockaddr sa;
|
struct sockaddr sa;
|
||||||
u8 tmp_addr[ETH_ALEN];
|
u8 tmp_addr[ETH_ALEN];
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ static int bond_debug_rlb_hash_show(struct seq_file *m, void *v)
|
|||||||
struct rlb_client_info *client_info;
|
struct rlb_client_info *client_info;
|
||||||
u32 hash_index;
|
u32 hash_index;
|
||||||
|
|
||||||
if (bond->params.mode != BOND_MODE_ALB)
|
if (BOND_MODE(bond) != BOND_MODE_ALB)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
seq_printf(m, "SourceIP DestinationIP "
|
seq_printf(m, "SourceIP DestinationIP "
|
||||||
|
@ -343,7 +343,7 @@ static int bond_set_carrier(struct bonding *bond)
|
|||||||
if (!bond_has_slaves(bond))
|
if (!bond_has_slaves(bond))
|
||||||
goto down;
|
goto down;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD)
|
if (BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
return bond_3ad_set_carrier(bond);
|
return bond_3ad_set_carrier(bond);
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave(bond, slave, iter) {
|
||||||
@ -497,7 +497,7 @@ static int bond_set_promiscuity(struct bonding *bond, int inc)
|
|||||||
struct list_head *iter;
|
struct list_head *iter;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
/* write lock already acquired */
|
/* write lock already acquired */
|
||||||
if (bond->curr_active_slave) {
|
if (bond->curr_active_slave) {
|
||||||
err = dev_set_promiscuity(bond->curr_active_slave->dev,
|
err = dev_set_promiscuity(bond->curr_active_slave->dev,
|
||||||
@ -523,7 +523,7 @@ static int bond_set_allmulti(struct bonding *bond, int inc)
|
|||||||
struct list_head *iter;
|
struct list_head *iter;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
/* write lock already acquired */
|
/* write lock already acquired */
|
||||||
if (bond->curr_active_slave) {
|
if (bond->curr_active_slave) {
|
||||||
err = dev_set_allmulti(bond->curr_active_slave->dev,
|
err = dev_set_allmulti(bond->curr_active_slave->dev,
|
||||||
@ -574,7 +574,7 @@ static void bond_hw_addr_flush(struct net_device *bond_dev,
|
|||||||
dev_uc_unsync(slave_dev, bond_dev);
|
dev_uc_unsync(slave_dev, bond_dev);
|
||||||
dev_mc_unsync(slave_dev, bond_dev);
|
dev_mc_unsync(slave_dev, bond_dev);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
/* del lacpdu mc addr from mc list */
|
/* del lacpdu mc addr from mc list */
|
||||||
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
|
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
|
||||||
|
|
||||||
@ -585,8 +585,8 @@ static void bond_hw_addr_flush(struct net_device *bond_dev,
|
|||||||
/*--------------------------- Active slave change ---------------------------*/
|
/*--------------------------- Active slave change ---------------------------*/
|
||||||
|
|
||||||
/* Update the hardware address list and promisc/allmulti for the new and
|
/* Update the hardware address list and promisc/allmulti for the new and
|
||||||
* old active slaves (if any). Modes that are !USES_PRIMARY keep all
|
* old active slaves (if any). Modes that are not using primary keep all
|
||||||
* slaves up date at all times; only the USES_PRIMARY modes need to call
|
* slaves up date at all times; only the modes that use primary need to call
|
||||||
* this function to swap these settings during a failover.
|
* this function to swap these settings during a failover.
|
||||||
*/
|
*/
|
||||||
static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active,
|
static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active,
|
||||||
@ -747,7 +747,7 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
|
|||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave(bond, slave, iter) {
|
||||||
if (slave->link == BOND_LINK_UP)
|
if (slave->link == BOND_LINK_UP)
|
||||||
return slave;
|
return slave;
|
||||||
if (slave->link == BOND_LINK_BACK && IS_UP(slave->dev) &&
|
if (slave->link == BOND_LINK_BACK && bond_slave_is_up(slave) &&
|
||||||
slave->delay < mintime) {
|
slave->delay < mintime) {
|
||||||
mintime = slave->delay;
|
mintime = slave->delay;
|
||||||
bestslave = slave;
|
bestslave = slave;
|
||||||
@ -801,7 +801,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||||||
new_active->last_link_up = jiffies;
|
new_active->last_link_up = jiffies;
|
||||||
|
|
||||||
if (new_active->link == BOND_LINK_BACK) {
|
if (new_active->link == BOND_LINK_BACK) {
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
pr_info("%s: making interface %s the new active one %d ms earlier\n",
|
pr_info("%s: making interface %s the new active one %d ms earlier\n",
|
||||||
bond->dev->name, new_active->dev->name,
|
bond->dev->name, new_active->dev->name,
|
||||||
(bond->params.updelay - new_active->delay) * bond->params.miimon);
|
(bond->params.updelay - new_active->delay) * bond->params.miimon);
|
||||||
@ -810,20 +810,20 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||||||
new_active->delay = 0;
|
new_active->delay = 0;
|
||||||
new_active->link = BOND_LINK_UP;
|
new_active->link = BOND_LINK_UP;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD)
|
if (BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
bond_3ad_handle_link_change(new_active, BOND_LINK_UP);
|
bond_3ad_handle_link_change(new_active, BOND_LINK_UP);
|
||||||
|
|
||||||
if (bond_is_lb(bond))
|
if (bond_is_lb(bond))
|
||||||
bond_alb_handle_link_change(bond, new_active, BOND_LINK_UP);
|
bond_alb_handle_link_change(bond, new_active, BOND_LINK_UP);
|
||||||
} else {
|
} else {
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
pr_info("%s: making interface %s the new active one\n",
|
pr_info("%s: making interface %s the new active one\n",
|
||||||
bond->dev->name, new_active->dev->name);
|
bond->dev->name, new_active->dev->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USES_PRIMARY(bond->params.mode))
|
if (bond_uses_primary(bond))
|
||||||
bond_hw_addr_swap(bond, new_active, old_active);
|
bond_hw_addr_swap(bond, new_active, old_active);
|
||||||
|
|
||||||
if (bond_is_lb(bond)) {
|
if (bond_is_lb(bond)) {
|
||||||
@ -838,7 +838,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||||||
rcu_assign_pointer(bond->curr_active_slave, new_active);
|
rcu_assign_pointer(bond->curr_active_slave, new_active);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) {
|
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP) {
|
||||||
if (old_active)
|
if (old_active)
|
||||||
bond_set_slave_inactive_flags(old_active,
|
bond_set_slave_inactive_flags(old_active,
|
||||||
BOND_SLAVE_NOTIFY_NOW);
|
BOND_SLAVE_NOTIFY_NOW);
|
||||||
@ -876,8 +876,8 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|||||||
* resend only if bond is brought up with the affected
|
* resend only if bond is brought up with the affected
|
||||||
* bonding modes and the retransmission is enabled */
|
* bonding modes and the retransmission is enabled */
|
||||||
if (netif_running(bond->dev) && (bond->params.resend_igmp > 0) &&
|
if (netif_running(bond->dev) && (bond->params.resend_igmp > 0) &&
|
||||||
((USES_PRIMARY(bond->params.mode) && new_active) ||
|
((bond_uses_primary(bond) && new_active) ||
|
||||||
bond->params.mode == BOND_MODE_ROUNDROBIN)) {
|
BOND_MODE(bond) == BOND_MODE_ROUNDROBIN)) {
|
||||||
bond->igmp_retrans = bond->params.resend_igmp;
|
bond->igmp_retrans = bond->params.resend_igmp;
|
||||||
queue_delayed_work(bond->wq, &bond->mcast_work, 1);
|
queue_delayed_work(bond->wq, &bond->mcast_work, 1);
|
||||||
}
|
}
|
||||||
@ -958,7 +958,7 @@ static void bond_netpoll_cleanup(struct net_device *bond_dev)
|
|||||||
struct slave *slave;
|
struct slave *slave;
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, iter)
|
bond_for_each_slave(bond, slave, iter)
|
||||||
if (IS_UP(slave->dev))
|
if (bond_slave_is_up(slave))
|
||||||
slave_disable_netpoll(slave);
|
slave_disable_netpoll(slave);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1084,7 +1084,7 @@ static bool bond_should_deliver_exact_match(struct sk_buff *skb,
|
|||||||
struct bonding *bond)
|
struct bonding *bond)
|
||||||
{
|
{
|
||||||
if (bond_is_slave_inactive(slave)) {
|
if (bond_is_slave_inactive(slave)) {
|
||||||
if (bond->params.mode == BOND_MODE_ALB &&
|
if (BOND_MODE(bond) == BOND_MODE_ALB &&
|
||||||
skb->pkt_type != PACKET_BROADCAST &&
|
skb->pkt_type != PACKET_BROADCAST &&
|
||||||
skb->pkt_type != PACKET_MULTICAST)
|
skb->pkt_type != PACKET_MULTICAST)
|
||||||
return false;
|
return false;
|
||||||
@ -1126,7 +1126,7 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)
|
|||||||
|
|
||||||
skb->dev = bond->dev;
|
skb->dev = bond->dev;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_ALB &&
|
if (BOND_MODE(bond) == BOND_MODE_ALB &&
|
||||||
bond->dev->priv_flags & IFF_BRIDGE_PORT &&
|
bond->dev->priv_flags & IFF_BRIDGE_PORT &&
|
||||||
skb->pkt_type == PACKET_HOST) {
|
skb->pkt_type == PACKET_HOST) {
|
||||||
|
|
||||||
@ -1171,7 +1171,7 @@ static struct slave *bond_alloc_slave(struct bonding *bond)
|
|||||||
if (!slave)
|
if (!slave)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
SLAVE_AD_INFO(slave) = kzalloc(sizeof(struct ad_slave_info),
|
SLAVE_AD_INFO(slave) = kzalloc(sizeof(struct ad_slave_info),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!SLAVE_AD_INFO(slave)) {
|
if (!SLAVE_AD_INFO(slave)) {
|
||||||
@ -1186,7 +1186,7 @@ static void bond_free_slave(struct slave *slave)
|
|||||||
{
|
{
|
||||||
struct bonding *bond = bond_get_bond_by_slave(slave);
|
struct bonding *bond = bond_get_bond_by_slave(slave);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD)
|
if (BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
kfree(SLAVE_AD_INFO(slave));
|
kfree(SLAVE_AD_INFO(slave));
|
||||||
|
|
||||||
kfree(slave);
|
kfree(slave);
|
||||||
@ -1298,7 +1298,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
if (!bond_has_slaves(bond)) {
|
if (!bond_has_slaves(bond)) {
|
||||||
pr_warn("%s: Warning: The first slave device specified does not support setting the MAC address\n",
|
pr_warn("%s: Warning: The first slave device specified does not support setting the MAC address\n",
|
||||||
bond_dev->name);
|
bond_dev->name);
|
||||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) {
|
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP) {
|
||||||
bond->params.fail_over_mac = BOND_FOM_ACTIVE;
|
bond->params.fail_over_mac = BOND_FOM_ACTIVE;
|
||||||
pr_warn("%s: Setting fail_over_mac to active for active-backup mode\n",
|
pr_warn("%s: Setting fail_over_mac to active for active-backup mode\n",
|
||||||
bond_dev->name);
|
bond_dev->name);
|
||||||
@ -1347,7 +1347,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
ether_addr_copy(new_slave->perm_hwaddr, slave_dev->dev_addr);
|
ether_addr_copy(new_slave->perm_hwaddr, slave_dev->dev_addr);
|
||||||
|
|
||||||
if (!bond->params.fail_over_mac ||
|
if (!bond->params.fail_over_mac ||
|
||||||
bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
|
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
|
||||||
/*
|
/*
|
||||||
* Set slave to master's mac address. The application already
|
* Set slave to master's mac address. The application already
|
||||||
* set the master's mac address to that of the first slave
|
* set the master's mac address to that of the first slave
|
||||||
@ -1381,10 +1381,10 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
goto err_close;
|
goto err_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the mode USES_PRIMARY, then the following is handled by
|
/* If the mode uses primary, then the following is handled by
|
||||||
* bond_change_active_slave().
|
* bond_change_active_slave().
|
||||||
*/
|
*/
|
||||||
if (!USES_PRIMARY(bond->params.mode)) {
|
if (!bond_uses_primary(bond)) {
|
||||||
/* set promiscuity level to new slave */
|
/* set promiscuity level to new slave */
|
||||||
if (bond_dev->flags & IFF_PROMISC) {
|
if (bond_dev->flags & IFF_PROMISC) {
|
||||||
res = dev_set_promiscuity(slave_dev, 1);
|
res = dev_set_promiscuity(slave_dev, 1);
|
||||||
@ -1407,7 +1407,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
netif_addr_unlock_bh(bond_dev);
|
netif_addr_unlock_bh(bond_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
/* add lacpdu mc addr to mc list */
|
/* add lacpdu mc addr to mc list */
|
||||||
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
|
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
|
||||||
|
|
||||||
@ -1480,7 +1480,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
new_slave->link == BOND_LINK_DOWN ? "DOWN" :
|
new_slave->link == BOND_LINK_DOWN ? "DOWN" :
|
||||||
(new_slave->link == BOND_LINK_UP ? "UP" : "BACK"));
|
(new_slave->link == BOND_LINK_UP ? "UP" : "BACK"));
|
||||||
|
|
||||||
if (USES_PRIMARY(bond->params.mode) && bond->params.primary[0]) {
|
if (bond_uses_primary(bond) && bond->params.primary[0]) {
|
||||||
/* if there is a primary slave, remember it */
|
/* if there is a primary slave, remember it */
|
||||||
if (strcmp(bond->params.primary, new_slave->dev->name) == 0) {
|
if (strcmp(bond->params.primary, new_slave->dev->name) == 0) {
|
||||||
bond->primary_slave = new_slave;
|
bond->primary_slave = new_slave;
|
||||||
@ -1488,7 +1488,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (bond->params.mode) {
|
switch (BOND_MODE(bond)) {
|
||||||
case BOND_MODE_ACTIVEBACKUP:
|
case BOND_MODE_ACTIVEBACKUP:
|
||||||
bond_set_slave_inactive_flags(new_slave,
|
bond_set_slave_inactive_flags(new_slave,
|
||||||
BOND_SLAVE_NOTIFY_NOW);
|
BOND_SLAVE_NOTIFY_NOW);
|
||||||
@ -1569,7 +1569,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||||||
bond_compute_features(bond);
|
bond_compute_features(bond);
|
||||||
bond_set_carrier(bond);
|
bond_set_carrier(bond);
|
||||||
|
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
block_netpoll_tx();
|
block_netpoll_tx();
|
||||||
write_lock_bh(&bond->curr_slave_lock);
|
write_lock_bh(&bond->curr_slave_lock);
|
||||||
bond_select_active_slave(bond);
|
bond_select_active_slave(bond);
|
||||||
@ -1593,7 +1593,7 @@ err_unregister:
|
|||||||
netdev_rx_handler_unregister(slave_dev);
|
netdev_rx_handler_unregister(slave_dev);
|
||||||
|
|
||||||
err_detach:
|
err_detach:
|
||||||
if (!USES_PRIMARY(bond->params.mode))
|
if (!bond_uses_primary(bond))
|
||||||
bond_hw_addr_flush(bond_dev, slave_dev);
|
bond_hw_addr_flush(bond_dev, slave_dev);
|
||||||
|
|
||||||
vlan_vids_del_by_dev(slave_dev, bond_dev);
|
vlan_vids_del_by_dev(slave_dev, bond_dev);
|
||||||
@ -1615,7 +1615,7 @@ err_close:
|
|||||||
|
|
||||||
err_restore_mac:
|
err_restore_mac:
|
||||||
if (!bond->params.fail_over_mac ||
|
if (!bond->params.fail_over_mac ||
|
||||||
bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
|
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
|
||||||
/* XXX TODO - fom follow mode needs to change master's
|
/* XXX TODO - fom follow mode needs to change master's
|
||||||
* MAC if this slave's MAC is in use by the bond, or at
|
* MAC if this slave's MAC is in use by the bond, or at
|
||||||
* least print a warning.
|
* least print a warning.
|
||||||
@ -1691,7 +1691,7 @@ static int __bond_release_one(struct net_device *bond_dev,
|
|||||||
write_lock_bh(&bond->lock);
|
write_lock_bh(&bond->lock);
|
||||||
|
|
||||||
/* Inform AD package of unbinding of slave. */
|
/* Inform AD package of unbinding of slave. */
|
||||||
if (bond->params.mode == BOND_MODE_8023AD)
|
if (BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
bond_3ad_unbind_slave(slave);
|
bond_3ad_unbind_slave(slave);
|
||||||
|
|
||||||
write_unlock_bh(&bond->lock);
|
write_unlock_bh(&bond->lock);
|
||||||
@ -1706,7 +1706,7 @@ static int __bond_release_one(struct net_device *bond_dev,
|
|||||||
bond->current_arp_slave = NULL;
|
bond->current_arp_slave = NULL;
|
||||||
|
|
||||||
if (!all && (!bond->params.fail_over_mac ||
|
if (!all && (!bond->params.fail_over_mac ||
|
||||||
bond->params.mode != BOND_MODE_ACTIVEBACKUP)) {
|
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP)) {
|
||||||
if (ether_addr_equal_64bits(bond_dev->dev_addr, slave->perm_hwaddr) &&
|
if (ether_addr_equal_64bits(bond_dev->dev_addr, slave->perm_hwaddr) &&
|
||||||
bond_has_slaves(bond))
|
bond_has_slaves(bond))
|
||||||
pr_warn("%s: Warning: the permanent HWaddr of %s - %pM - is still in use by %s - set the HWaddr of %s to a different address to avoid conflicts\n",
|
pr_warn("%s: Warning: the permanent HWaddr of %s - %pM - is still in use by %s - set the HWaddr of %s to a different address to avoid conflicts\n",
|
||||||
@ -1778,10 +1778,10 @@ static int __bond_release_one(struct net_device *bond_dev,
|
|||||||
/* must do this from outside any spinlocks */
|
/* must do this from outside any spinlocks */
|
||||||
vlan_vids_del_by_dev(slave_dev, bond_dev);
|
vlan_vids_del_by_dev(slave_dev, bond_dev);
|
||||||
|
|
||||||
/* If the mode USES_PRIMARY, then this cases was handled above by
|
/* If the mode uses primary, then this cases was handled above by
|
||||||
* bond_change_active_slave(..., NULL)
|
* bond_change_active_slave(..., NULL)
|
||||||
*/
|
*/
|
||||||
if (!USES_PRIMARY(bond->params.mode)) {
|
if (!bond_uses_primary(bond)) {
|
||||||
/* unset promiscuity level from slave
|
/* unset promiscuity level from slave
|
||||||
* NOTE: The NETDEV_CHANGEADDR call above may change the value
|
* NOTE: The NETDEV_CHANGEADDR call above may change the value
|
||||||
* of the IFF_PROMISC flag in the bond_dev, but we need the
|
* of the IFF_PROMISC flag in the bond_dev, but we need the
|
||||||
@ -1805,7 +1805,7 @@ static int __bond_release_one(struct net_device *bond_dev,
|
|||||||
dev_close(slave_dev);
|
dev_close(slave_dev);
|
||||||
|
|
||||||
if (bond->params.fail_over_mac != BOND_FOM_ACTIVE ||
|
if (bond->params.fail_over_mac != BOND_FOM_ACTIVE ||
|
||||||
bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
|
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
|
||||||
/* restore original ("permanent") mac address */
|
/* restore original ("permanent") mac address */
|
||||||
ether_addr_copy(addr.sa_data, slave->perm_hwaddr);
|
ether_addr_copy(addr.sa_data, slave->perm_hwaddr);
|
||||||
addr.sa_family = slave_dev->type;
|
addr.sa_family = slave_dev->type;
|
||||||
@ -1851,7 +1851,7 @@ static int bond_info_query(struct net_device *bond_dev, struct ifbond *info)
|
|||||||
{
|
{
|
||||||
struct bonding *bond = netdev_priv(bond_dev);
|
struct bonding *bond = netdev_priv(bond_dev);
|
||||||
|
|
||||||
info->bond_mode = bond->params.mode;
|
info->bond_mode = BOND_MODE(bond);
|
||||||
info->miimon = bond->params.miimon;
|
info->miimon = bond->params.miimon;
|
||||||
|
|
||||||
info->num_slaves = bond->slave_cnt;
|
info->num_slaves = bond->slave_cnt;
|
||||||
@ -1907,7 +1907,7 @@ static int bond_miimon_inspect(struct bonding *bond)
|
|||||||
if (slave->delay) {
|
if (slave->delay) {
|
||||||
pr_info("%s: link status down for %sinterface %s, disabling it in %d ms\n",
|
pr_info("%s: link status down for %sinterface %s, disabling it in %d ms\n",
|
||||||
bond->dev->name,
|
bond->dev->name,
|
||||||
(bond->params.mode ==
|
(BOND_MODE(bond) ==
|
||||||
BOND_MODE_ACTIVEBACKUP) ?
|
BOND_MODE_ACTIVEBACKUP) ?
|
||||||
(bond_is_active_slave(slave) ?
|
(bond_is_active_slave(slave) ?
|
||||||
"active " : "backup ") : "",
|
"active " : "backup ") : "",
|
||||||
@ -1998,10 +1998,10 @@ static void bond_miimon_commit(struct bonding *bond)
|
|||||||
slave->link = BOND_LINK_UP;
|
slave->link = BOND_LINK_UP;
|
||||||
slave->last_link_up = jiffies;
|
slave->last_link_up = jiffies;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
/* prevent it from being the active one */
|
/* prevent it from being the active one */
|
||||||
bond_set_backup_slave(slave);
|
bond_set_backup_slave(slave);
|
||||||
} else if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
|
} else if (BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
|
||||||
/* make it immediately active */
|
/* make it immediately active */
|
||||||
bond_set_active_slave(slave);
|
bond_set_active_slave(slave);
|
||||||
} else if (slave != bond->primary_slave) {
|
} else if (slave != bond->primary_slave) {
|
||||||
@ -2015,7 +2015,7 @@ static void bond_miimon_commit(struct bonding *bond)
|
|||||||
slave->duplex ? "full" : "half");
|
slave->duplex ? "full" : "half");
|
||||||
|
|
||||||
/* notify ad that the link status has changed */
|
/* notify ad that the link status has changed */
|
||||||
if (bond->params.mode == BOND_MODE_8023AD)
|
if (BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
bond_3ad_handle_link_change(slave, BOND_LINK_UP);
|
bond_3ad_handle_link_change(slave, BOND_LINK_UP);
|
||||||
|
|
||||||
if (bond_is_lb(bond))
|
if (bond_is_lb(bond))
|
||||||
@ -2034,15 +2034,15 @@ static void bond_miimon_commit(struct bonding *bond)
|
|||||||
|
|
||||||
slave->link = BOND_LINK_DOWN;
|
slave->link = BOND_LINK_DOWN;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
|
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP ||
|
||||||
bond->params.mode == BOND_MODE_8023AD)
|
BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
bond_set_slave_inactive_flags(slave,
|
bond_set_slave_inactive_flags(slave,
|
||||||
BOND_SLAVE_NOTIFY_NOW);
|
BOND_SLAVE_NOTIFY_NOW);
|
||||||
|
|
||||||
pr_info("%s: link status definitely down for interface %s, disabling it\n",
|
pr_info("%s: link status definitely down for interface %s, disabling it\n",
|
||||||
bond->dev->name, slave->dev->name);
|
bond->dev->name, slave->dev->name);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD)
|
if (BOND_MODE(bond) == BOND_MODE_8023AD)
|
||||||
bond_3ad_handle_link_change(slave,
|
bond_3ad_handle_link_change(slave,
|
||||||
BOND_LINK_DOWN);
|
BOND_LINK_DOWN);
|
||||||
|
|
||||||
@ -2490,7 +2490,7 @@ static void bond_loadbalance_arp_mon(struct work_struct *work)
|
|||||||
* do - all replies will be rx'ed on same link causing slaves
|
* do - all replies will be rx'ed on same link causing slaves
|
||||||
* to be unstable during low/no traffic periods
|
* to be unstable during low/no traffic periods
|
||||||
*/
|
*/
|
||||||
if (IS_UP(slave->dev))
|
if (bond_slave_is_up(slave))
|
||||||
bond_arp_send_all(bond, slave);
|
bond_arp_send_all(bond, slave);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2712,10 +2712,10 @@ static bool bond_ab_arp_probe(struct bonding *bond)
|
|||||||
bond_set_slave_inactive_flags(curr_arp_slave, BOND_SLAVE_NOTIFY_LATER);
|
bond_set_slave_inactive_flags(curr_arp_slave, BOND_SLAVE_NOTIFY_LATER);
|
||||||
|
|
||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (!found && !before && IS_UP(slave->dev))
|
if (!found && !before && bond_slave_is_up(slave))
|
||||||
before = slave;
|
before = slave;
|
||||||
|
|
||||||
if (found && !new_slave && IS_UP(slave->dev))
|
if (found && !new_slave && bond_slave_is_up(slave))
|
||||||
new_slave = slave;
|
new_slave = slave;
|
||||||
/* if the link state is up at this point, we
|
/* if the link state is up at this point, we
|
||||||
* mark it down - this can happen if we have
|
* mark it down - this can happen if we have
|
||||||
@ -2724,7 +2724,7 @@ static bool bond_ab_arp_probe(struct bonding *bond)
|
|||||||
* one the current slave so it is still marked
|
* one the current slave so it is still marked
|
||||||
* up when it is actually down
|
* up when it is actually down
|
||||||
*/
|
*/
|
||||||
if (!IS_UP(slave->dev) && slave->link == BOND_LINK_UP) {
|
if (!bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) {
|
||||||
slave->link = BOND_LINK_DOWN;
|
slave->link = BOND_LINK_DOWN;
|
||||||
if (slave->link_failure_count < UINT_MAX)
|
if (slave->link_failure_count < UINT_MAX)
|
||||||
slave->link_failure_count++;
|
slave->link_failure_count++;
|
||||||
@ -2887,7 +2887,7 @@ static int bond_slave_netdev_event(unsigned long event,
|
|||||||
|
|
||||||
bond_update_speed_duplex(slave);
|
bond_update_speed_duplex(slave);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
if (old_speed != slave->speed)
|
if (old_speed != slave->speed)
|
||||||
bond_3ad_adapter_speed_changed(slave);
|
bond_3ad_adapter_speed_changed(slave);
|
||||||
if (old_duplex != slave->duplex)
|
if (old_duplex != slave->duplex)
|
||||||
@ -2915,7 +2915,7 @@ static int bond_slave_netdev_event(unsigned long event,
|
|||||||
break;
|
break;
|
||||||
case NETDEV_CHANGENAME:
|
case NETDEV_CHANGENAME:
|
||||||
/* we don't care if we don't have primary set */
|
/* we don't care if we don't have primary set */
|
||||||
if (!USES_PRIMARY(bond->params.mode) ||
|
if (!bond_uses_primary(bond) ||
|
||||||
!bond->params.primary[0])
|
!bond->params.primary[0])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3078,7 +3078,7 @@ static void bond_work_init_all(struct bonding *bond)
|
|||||||
bond_resend_igmp_join_requests_delayed);
|
bond_resend_igmp_join_requests_delayed);
|
||||||
INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor);
|
INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor);
|
||||||
INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor);
|
INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor);
|
||||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP)
|
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP)
|
||||||
INIT_DELAYED_WORK(&bond->arp_work, bond_activebackup_arp_mon);
|
INIT_DELAYED_WORK(&bond->arp_work, bond_activebackup_arp_mon);
|
||||||
else
|
else
|
||||||
INIT_DELAYED_WORK(&bond->arp_work, bond_loadbalance_arp_mon);
|
INIT_DELAYED_WORK(&bond->arp_work, bond_loadbalance_arp_mon);
|
||||||
@ -3105,7 +3105,7 @@ static int bond_open(struct net_device *bond_dev)
|
|||||||
if (bond_has_slaves(bond)) {
|
if (bond_has_slaves(bond)) {
|
||||||
read_lock(&bond->curr_slave_lock);
|
read_lock(&bond->curr_slave_lock);
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave(bond, slave, iter) {
|
||||||
if (USES_PRIMARY(bond->params.mode)
|
if (bond_uses_primary(bond)
|
||||||
&& (slave != bond->curr_active_slave)) {
|
&& (slave != bond->curr_active_slave)) {
|
||||||
bond_set_slave_inactive_flags(slave,
|
bond_set_slave_inactive_flags(slave,
|
||||||
BOND_SLAVE_NOTIFY_NOW);
|
BOND_SLAVE_NOTIFY_NOW);
|
||||||
@ -3124,7 +3124,7 @@ static int bond_open(struct net_device *bond_dev)
|
|||||||
/* bond_alb_initialize must be called before the timer
|
/* bond_alb_initialize must be called before the timer
|
||||||
* is started.
|
* is started.
|
||||||
*/
|
*/
|
||||||
if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB)))
|
if (bond_alb_initialize(bond, (BOND_MODE(bond) == BOND_MODE_ALB)))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
if (bond->params.tlb_dynamic_lb)
|
if (bond->params.tlb_dynamic_lb)
|
||||||
queue_delayed_work(bond->wq, &bond->alb_work, 0);
|
queue_delayed_work(bond->wq, &bond->alb_work, 0);
|
||||||
@ -3138,7 +3138,7 @@ static int bond_open(struct net_device *bond_dev)
|
|||||||
bond->recv_probe = bond_arp_rcv;
|
bond->recv_probe = bond_arp_rcv;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
queue_delayed_work(bond->wq, &bond->ad_work, 0);
|
queue_delayed_work(bond->wq, &bond->ad_work, 0);
|
||||||
/* register to receive LACPDUs */
|
/* register to receive LACPDUs */
|
||||||
bond->recv_probe = bond_3ad_lacpdu_recv;
|
bond->recv_probe = bond_3ad_lacpdu_recv;
|
||||||
@ -3343,7 +3343,7 @@ static void bond_set_rx_mode(struct net_device *bond_dev)
|
|||||||
|
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
slave = rcu_dereference(bond->curr_active_slave);
|
slave = rcu_dereference(bond->curr_active_slave);
|
||||||
if (slave) {
|
if (slave) {
|
||||||
dev_uc_sync(slave->dev, bond_dev);
|
dev_uc_sync(slave->dev, bond_dev);
|
||||||
@ -3497,7 +3497,7 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
|
|||||||
struct list_head *iter;
|
struct list_head *iter;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_ALB)
|
if (BOND_MODE(bond) == BOND_MODE_ALB)
|
||||||
return bond_alb_set_mac_address(bond_dev, addr);
|
return bond_alb_set_mac_address(bond_dev, addr);
|
||||||
|
|
||||||
|
|
||||||
@ -3508,7 +3508,7 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
|
|||||||
* Returning an error causes ifenslave to fail.
|
* Returning an error causes ifenslave to fail.
|
||||||
*/
|
*/
|
||||||
if (bond->params.fail_over_mac &&
|
if (bond->params.fail_over_mac &&
|
||||||
bond->params.mode == BOND_MODE_ACTIVEBACKUP)
|
BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!is_valid_ether_addr(sa->sa_data))
|
if (!is_valid_ether_addr(sa->sa_data))
|
||||||
@ -3588,7 +3588,7 @@ static void bond_xmit_slave_id(struct bonding *bond, struct sk_buff *skb, int sl
|
|||||||
/* Here we start from the slave with slave_id */
|
/* Here we start from the slave with slave_id */
|
||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (--i < 0) {
|
if (--i < 0) {
|
||||||
if (slave_can_tx(slave)) {
|
if (bond_slave_can_tx(slave)) {
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3600,7 +3600,7 @@ static void bond_xmit_slave_id(struct bonding *bond, struct sk_buff *skb, int sl
|
|||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (--i < 0)
|
if (--i < 0)
|
||||||
break;
|
break;
|
||||||
if (slave_can_tx(slave)) {
|
if (bond_slave_can_tx(slave)) {
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3657,7 +3657,7 @@ static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev
|
|||||||
*/
|
*/
|
||||||
if (iph->protocol == IPPROTO_IGMP && skb->protocol == htons(ETH_P_IP)) {
|
if (iph->protocol == IPPROTO_IGMP && skb->protocol == htons(ETH_P_IP)) {
|
||||||
slave = rcu_dereference(bond->curr_active_slave);
|
slave = rcu_dereference(bond->curr_active_slave);
|
||||||
if (slave && slave_can_tx(slave))
|
if (slave && bond_slave_can_tx(slave))
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
else
|
else
|
||||||
bond_xmit_slave_id(bond, skb, 0);
|
bond_xmit_slave_id(bond, skb, 0);
|
||||||
@ -3710,7 +3710,7 @@ static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *bond_dev)
|
|||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (bond_is_last_slave(bond, slave))
|
if (bond_is_last_slave(bond, slave))
|
||||||
break;
|
break;
|
||||||
if (IS_UP(slave->dev) && slave->link == BOND_LINK_UP) {
|
if (bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) {
|
||||||
struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
|
struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||||
|
|
||||||
if (!skb2) {
|
if (!skb2) {
|
||||||
@ -3722,7 +3722,7 @@ static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *bond_dev)
|
|||||||
bond_dev_queue_xmit(bond, skb2, slave->dev);
|
bond_dev_queue_xmit(bond, skb2, slave->dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (slave && IS_UP(slave->dev) && slave->link == BOND_LINK_UP)
|
if (slave && bond_slave_is_up(slave) && slave->link == BOND_LINK_UP)
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
else
|
else
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
@ -3747,7 +3747,7 @@ static inline int bond_slave_override(struct bonding *bond,
|
|||||||
/* Find out if any slaves have the same mapping as this skb. */
|
/* Find out if any slaves have the same mapping as this skb. */
|
||||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||||
if (slave->queue_id == skb->queue_mapping) {
|
if (slave->queue_id == skb->queue_mapping) {
|
||||||
if (slave_can_tx(slave)) {
|
if (bond_slave_can_tx(slave)) {
|
||||||
bond_dev_queue_xmit(bond, skb, slave->dev);
|
bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3788,12 +3788,11 @@ static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev
|
|||||||
{
|
{
|
||||||
struct bonding *bond = netdev_priv(dev);
|
struct bonding *bond = netdev_priv(dev);
|
||||||
|
|
||||||
if (TX_QUEUE_OVERRIDE(bond->params.mode)) {
|
if (bond_should_override_tx_queue(bond) &&
|
||||||
if (!bond_slave_override(bond, skb))
|
!bond_slave_override(bond, skb))
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
|
||||||
|
|
||||||
switch (bond->params.mode) {
|
switch (BOND_MODE(bond)) {
|
||||||
case BOND_MODE_ROUNDROBIN:
|
case BOND_MODE_ROUNDROBIN:
|
||||||
return bond_xmit_roundrobin(skb, dev);
|
return bond_xmit_roundrobin(skb, dev);
|
||||||
case BOND_MODE_ACTIVEBACKUP:
|
case BOND_MODE_ACTIVEBACKUP:
|
||||||
@ -3811,7 +3810,7 @@ static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev
|
|||||||
default:
|
default:
|
||||||
/* Should never happen, mode already checked */
|
/* Should never happen, mode already checked */
|
||||||
pr_err("%s: Error: Unknown bonding mode %d\n",
|
pr_err("%s: Error: Unknown bonding mode %d\n",
|
||||||
dev->name, bond->params.mode);
|
dev->name, BOND_MODE(bond));
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
@ -3851,14 +3850,14 @@ static int bond_ethtool_get_settings(struct net_device *bond_dev,
|
|||||||
ecmd->duplex = DUPLEX_UNKNOWN;
|
ecmd->duplex = DUPLEX_UNKNOWN;
|
||||||
ecmd->port = PORT_OTHER;
|
ecmd->port = PORT_OTHER;
|
||||||
|
|
||||||
/* Since SLAVE_IS_OK returns false for all inactive or down slaves, we
|
/* Since bond_slave_can_tx returns false for all inactive or down slaves, we
|
||||||
* do not need to check mode. Though link speed might not represent
|
* do not need to check mode. Though link speed might not represent
|
||||||
* the true receive or transmit bandwidth (not all modes are symmetric)
|
* the true receive or transmit bandwidth (not all modes are symmetric)
|
||||||
* this is an accurate maximum.
|
* this is an accurate maximum.
|
||||||
*/
|
*/
|
||||||
read_lock(&bond->lock);
|
read_lock(&bond->lock);
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave(bond, slave, iter) {
|
||||||
if (SLAVE_IS_OK(slave)) {
|
if (bond_slave_can_tx(slave)) {
|
||||||
if (slave->speed != SPEED_UNKNOWN)
|
if (slave->speed != SPEED_UNKNOWN)
|
||||||
speed += slave->speed;
|
speed += slave->speed;
|
||||||
if (ecmd->duplex == DUPLEX_UNKNOWN &&
|
if (ecmd->duplex == DUPLEX_UNKNOWN &&
|
||||||
@ -4114,7 +4113,7 @@ static int bond_check_params(struct bond_params *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* reset values for 802.3ad/TLB/ALB */
|
/* reset values for 802.3ad/TLB/ALB */
|
||||||
if (BOND_NO_USES_ARP(bond_mode)) {
|
if (!bond_mode_uses_arp(bond_mode)) {
|
||||||
if (!miimon) {
|
if (!miimon) {
|
||||||
pr_warn("Warning: miimon must be specified, otherwise bonding will not detect link failure, speed and duplex which are essential for 802.3ad operation\n");
|
pr_warn("Warning: miimon must be specified, otherwise bonding will not detect link failure, speed and duplex which are essential for 802.3ad operation\n");
|
||||||
pr_warn("Forcing miimon to 100msec\n");
|
pr_warn("Forcing miimon to 100msec\n");
|
||||||
@ -4196,7 +4195,7 @@ static int bond_check_params(struct bond_params *params)
|
|||||||
catch mistakes */
|
catch mistakes */
|
||||||
__be32 ip;
|
__be32 ip;
|
||||||
if (!in4_pton(arp_ip_target[i], -1, (u8 *)&ip, -1, NULL) ||
|
if (!in4_pton(arp_ip_target[i], -1, (u8 *)&ip, -1, NULL) ||
|
||||||
IS_IP_TARGET_UNUSABLE_ADDRESS(ip)) {
|
!bond_is_ip_target_ok(ip)) {
|
||||||
pr_warn("Warning: bad arp_ip_target module parameter (%s), ARP monitoring will not be performed\n",
|
pr_warn("Warning: bad arp_ip_target module parameter (%s), ARP monitoring will not be performed\n",
|
||||||
arp_ip_target[i]);
|
arp_ip_target[i]);
|
||||||
arp_interval = 0;
|
arp_interval = 0;
|
||||||
@ -4269,7 +4268,7 @@ static int bond_check_params(struct bond_params *params)
|
|||||||
pr_debug("Warning: either miimon or arp_interval and arp_ip_target module parameters must be specified, otherwise bonding will not detect link failures! see bonding.txt for details\n");
|
pr_debug("Warning: either miimon or arp_interval and arp_ip_target module parameters must be specified, otherwise bonding will not detect link failures! see bonding.txt for details\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (primary && !USES_PRIMARY(bond_mode)) {
|
if (primary && !bond_mode_uses_primary(bond_mode)) {
|
||||||
/* currently, using a primary only makes sense
|
/* currently, using a primary only makes sense
|
||||||
* in active backup, TLB or ALB modes
|
* in active backup, TLB or ALB modes
|
||||||
*/
|
*/
|
||||||
|
@ -56,7 +56,7 @@ static int bond_fill_slave_info(struct sk_buff *skb,
|
|||||||
if (nla_put_u16(skb, IFLA_BOND_SLAVE_QUEUE_ID, slave->queue_id))
|
if (nla_put_u16(skb, IFLA_BOND_SLAVE_QUEUE_ID, slave->queue_id))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (slave->bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
|
||||||
const struct aggregator *agg;
|
const struct aggregator *agg;
|
||||||
|
|
||||||
agg = SLAVE_AD_INFO(slave)->port.aggregator;
|
agg = SLAVE_AD_INFO(slave)->port.aggregator;
|
||||||
@ -407,7 +407,7 @@ static int bond_fill_info(struct sk_buff *skb,
|
|||||||
unsigned int packets_per_slave;
|
unsigned int packets_per_slave;
|
||||||
int i, targets_added;
|
int i, targets_added;
|
||||||
|
|
||||||
if (nla_put_u8(skb, IFLA_BOND_MODE, bond->params.mode))
|
if (nla_put_u8(skb, IFLA_BOND_MODE, BOND_MODE(bond)))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (slave_dev &&
|
if (slave_dev &&
|
||||||
@ -505,7 +505,7 @@ static int bond_fill_info(struct sk_buff *skb,
|
|||||||
bond->params.ad_select))
|
bond->params.ad_select))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info info;
|
struct ad_info info;
|
||||||
|
|
||||||
if (!bond_3ad_get_active_agg_info(bond, &info)) {
|
if (!bond_3ad_get_active_agg_info(bond, &info)) {
|
||||||
|
@ -672,7 +672,7 @@ const struct bond_option *bond_opt_get(unsigned int option)
|
|||||||
|
|
||||||
int bond_option_mode_set(struct bonding *bond, const struct bond_opt_value *newval)
|
int bond_option_mode_set(struct bonding *bond, const struct bond_opt_value *newval)
|
||||||
{
|
{
|
||||||
if (BOND_NO_USES_ARP(newval->value) && bond->params.arp_interval) {
|
if (!bond_mode_uses_arp(newval->value) && bond->params.arp_interval) {
|
||||||
pr_info("%s: %s mode is incompatible with arp monitoring, start mii monitoring\n",
|
pr_info("%s: %s mode is incompatible with arp monitoring, start mii monitoring\n",
|
||||||
bond->dev->name, newval->string);
|
bond->dev->name, newval->string);
|
||||||
/* disable arp monitoring */
|
/* disable arp monitoring */
|
||||||
@ -693,7 +693,7 @@ int bond_option_mode_set(struct bonding *bond, const struct bond_opt_value *newv
|
|||||||
static struct net_device *__bond_option_active_slave_get(struct bonding *bond,
|
static struct net_device *__bond_option_active_slave_get(struct bonding *bond,
|
||||||
struct slave *slave)
|
struct slave *slave)
|
||||||
{
|
{
|
||||||
return USES_PRIMARY(bond->params.mode) && slave ? slave->dev : NULL;
|
return bond_uses_primary(bond) && slave ? slave->dev : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond)
|
struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond)
|
||||||
@ -758,7 +758,7 @@ static int bond_option_active_slave_set(struct bonding *bond,
|
|||||||
bond->dev->name, new_active->dev->name);
|
bond->dev->name, new_active->dev->name);
|
||||||
} else {
|
} else {
|
||||||
if (old_active && (new_active->link == BOND_LINK_UP) &&
|
if (old_active && (new_active->link == BOND_LINK_UP) &&
|
||||||
IS_UP(new_active->dev)) {
|
bond_slave_is_up(new_active)) {
|
||||||
pr_info("%s: Setting %s as active slave\n",
|
pr_info("%s: Setting %s as active slave\n",
|
||||||
bond->dev->name, new_active->dev->name);
|
bond->dev->name, new_active->dev->name);
|
||||||
bond_change_active_slave(bond, new_active);
|
bond_change_active_slave(bond, new_active);
|
||||||
@ -942,7 +942,7 @@ static int _bond_option_arp_ip_target_add(struct bonding *bond, __be32 target)
|
|||||||
__be32 *targets = bond->params.arp_targets;
|
__be32 *targets = bond->params.arp_targets;
|
||||||
int ind;
|
int ind;
|
||||||
|
|
||||||
if (IS_IP_TARGET_UNUSABLE_ADDRESS(target)) {
|
if (!bond_is_ip_target_ok(target)) {
|
||||||
pr_err("%s: invalid ARP target %pI4 specified for addition\n",
|
pr_err("%s: invalid ARP target %pI4 specified for addition\n",
|
||||||
bond->dev->name, &target);
|
bond->dev->name, &target);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -987,7 +987,7 @@ static int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target)
|
|||||||
unsigned long *targets_rx;
|
unsigned long *targets_rx;
|
||||||
int ind, i;
|
int ind, i;
|
||||||
|
|
||||||
if (IS_IP_TARGET_UNUSABLE_ADDRESS(target)) {
|
if (!bond_is_ip_target_ok(target)) {
|
||||||
pr_err("%s: invalid ARP target %pI4 specified for removal\n",
|
pr_err("%s: invalid ARP target %pI4 specified for removal\n",
|
||||||
bond->dev->name, &target);
|
bond->dev->name, &target);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -72,9 +72,9 @@ static void bond_info_show_master(struct seq_file *seq)
|
|||||||
curr = rcu_dereference(bond->curr_active_slave);
|
curr = rcu_dereference(bond->curr_active_slave);
|
||||||
|
|
||||||
seq_printf(seq, "Bonding Mode: %s",
|
seq_printf(seq, "Bonding Mode: %s",
|
||||||
bond_mode_name(bond->params.mode));
|
bond_mode_name(BOND_MODE(bond)));
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP &&
|
if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP &&
|
||||||
bond->params.fail_over_mac) {
|
bond->params.fail_over_mac) {
|
||||||
optval = bond_opt_get_val(BOND_OPT_FAIL_OVER_MAC,
|
optval = bond_opt_get_val(BOND_OPT_FAIL_OVER_MAC,
|
||||||
bond->params.fail_over_mac);
|
bond->params.fail_over_mac);
|
||||||
@ -83,15 +83,15 @@ static void bond_info_show_master(struct seq_file *seq)
|
|||||||
|
|
||||||
seq_printf(seq, "\n");
|
seq_printf(seq, "\n");
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_XOR ||
|
if (BOND_MODE(bond) == BOND_MODE_XOR ||
|
||||||
bond->params.mode == BOND_MODE_8023AD) {
|
BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
optval = bond_opt_get_val(BOND_OPT_XMIT_HASH,
|
optval = bond_opt_get_val(BOND_OPT_XMIT_HASH,
|
||||||
bond->params.xmit_policy);
|
bond->params.xmit_policy);
|
||||||
seq_printf(seq, "Transmit Hash Policy: %s (%d)\n",
|
seq_printf(seq, "Transmit Hash Policy: %s (%d)\n",
|
||||||
optval->string, bond->params.xmit_policy);
|
optval->string, bond->params.xmit_policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USES_PRIMARY(bond->params.mode)) {
|
if (bond_uses_primary(bond)) {
|
||||||
seq_printf(seq, "Primary Slave: %s",
|
seq_printf(seq, "Primary Slave: %s",
|
||||||
(bond->primary_slave) ?
|
(bond->primary_slave) ?
|
||||||
bond->primary_slave->dev->name : "None");
|
bond->primary_slave->dev->name : "None");
|
||||||
@ -134,7 +134,7 @@ static void bond_info_show_master(struct seq_file *seq)
|
|||||||
seq_printf(seq, "\n");
|
seq_printf(seq, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
|
|
||||||
seq_puts(seq, "\n802.3ad info\n");
|
seq_puts(seq, "\n802.3ad info\n");
|
||||||
@ -188,7 +188,7 @@ static void bond_info_show_slave(struct seq_file *seq,
|
|||||||
|
|
||||||
seq_printf(seq, "Permanent HW addr: %pM\n", slave->perm_hwaddr);
|
seq_printf(seq, "Permanent HW addr: %pM\n", slave->perm_hwaddr);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
const struct aggregator *agg
|
const struct aggregator *agg
|
||||||
= SLAVE_AD_INFO(slave)->port.aggregator;
|
= SLAVE_AD_INFO(slave)->port.aggregator;
|
||||||
|
|
||||||
|
@ -214,9 +214,9 @@ static ssize_t bonding_show_mode(struct device *d,
|
|||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
const struct bond_opt_value *val;
|
const struct bond_opt_value *val;
|
||||||
|
|
||||||
val = bond_opt_get_val(BOND_OPT_MODE, bond->params.mode);
|
val = bond_opt_get_val(BOND_OPT_MODE, BOND_MODE(bond));
|
||||||
|
|
||||||
return sprintf(buf, "%s %d\n", val->string, bond->params.mode);
|
return sprintf(buf, "%s %d\n", val->string, BOND_MODE(bond));
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
|
static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
|
||||||
bonding_show_mode, bonding_sysfs_store_option);
|
bonding_show_mode, bonding_sysfs_store_option);
|
||||||
@ -505,7 +505,7 @@ static ssize_t bonding_show_ad_aggregator(struct device *d,
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
count = sprintf(buf, "%d\n",
|
count = sprintf(buf, "%d\n",
|
||||||
bond_3ad_get_active_agg_info(bond, &ad_info)
|
bond_3ad_get_active_agg_info(bond, &ad_info)
|
||||||
@ -525,7 +525,7 @@ static ssize_t bonding_show_ad_num_ports(struct device *d,
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
count = sprintf(buf, "%d\n",
|
count = sprintf(buf, "%d\n",
|
||||||
bond_3ad_get_active_agg_info(bond, &ad_info)
|
bond_3ad_get_active_agg_info(bond, &ad_info)
|
||||||
@ -545,7 +545,7 @@ static ssize_t bonding_show_ad_actor_key(struct device *d,
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
count = sprintf(buf, "%d\n",
|
count = sprintf(buf, "%d\n",
|
||||||
bond_3ad_get_active_agg_info(bond, &ad_info)
|
bond_3ad_get_active_agg_info(bond, &ad_info)
|
||||||
@ -565,7 +565,7 @@ static ssize_t bonding_show_ad_partner_key(struct device *d,
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
count = sprintf(buf, "%d\n",
|
count = sprintf(buf, "%d\n",
|
||||||
bond_3ad_get_active_agg_info(bond, &ad_info)
|
bond_3ad_get_active_agg_info(bond, &ad_info)
|
||||||
@ -585,7 +585,7 @@ static ssize_t bonding_show_ad_partner_mac(struct device *d,
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
|
|
||||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
if (!bond_3ad_get_active_agg_info(bond, &ad_info))
|
if (!bond_3ad_get_active_agg_info(bond, &ad_info))
|
||||||
count = sprintf(buf, "%pM\n", ad_info.partner_system);
|
count = sprintf(buf, "%pM\n", ad_info.partner_system);
|
||||||
|
@ -69,7 +69,7 @@ static ssize_t ad_aggregator_id_show(struct slave *slave, char *buf)
|
|||||||
{
|
{
|
||||||
const struct aggregator *agg;
|
const struct aggregator *agg;
|
||||||
|
|
||||||
if (slave->bond->params.mode == BOND_MODE_8023AD) {
|
if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
|
||||||
agg = SLAVE_AD_INFO(slave)->port.aggregator;
|
agg = SLAVE_AD_INFO(slave)->port.aggregator;
|
||||||
if (agg)
|
if (agg)
|
||||||
return sprintf(buf, "%d\n",
|
return sprintf(buf, "%d\n",
|
||||||
|
@ -40,42 +40,6 @@
|
|||||||
|
|
||||||
#define BOND_DEFAULT_MIIMON 100
|
#define BOND_DEFAULT_MIIMON 100
|
||||||
|
|
||||||
#define IS_UP(dev) \
|
|
||||||
((((dev)->flags & IFF_UP) == IFF_UP) && \
|
|
||||||
netif_running(dev) && \
|
|
||||||
netif_carrier_ok(dev))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks whether slave is ready for transmit.
|
|
||||||
*/
|
|
||||||
#define SLAVE_IS_OK(slave) \
|
|
||||||
(((slave)->dev->flags & IFF_UP) && \
|
|
||||||
netif_running((slave)->dev) && \
|
|
||||||
((slave)->link == BOND_LINK_UP) && \
|
|
||||||
bond_is_active_slave(slave))
|
|
||||||
|
|
||||||
|
|
||||||
#define USES_PRIMARY(mode) \
|
|
||||||
(((mode) == BOND_MODE_ACTIVEBACKUP) || \
|
|
||||||
((mode) == BOND_MODE_TLB) || \
|
|
||||||
((mode) == BOND_MODE_ALB))
|
|
||||||
|
|
||||||
#define BOND_NO_USES_ARP(mode) \
|
|
||||||
(((mode) == BOND_MODE_8023AD) || \
|
|
||||||
((mode) == BOND_MODE_TLB) || \
|
|
||||||
((mode) == BOND_MODE_ALB))
|
|
||||||
|
|
||||||
#define TX_QUEUE_OVERRIDE(mode) \
|
|
||||||
(((mode) == BOND_MODE_ACTIVEBACKUP) || \
|
|
||||||
((mode) == BOND_MODE_ROUNDROBIN))
|
|
||||||
|
|
||||||
#define BOND_MODE_IS_LB(mode) \
|
|
||||||
(((mode) == BOND_MODE_TLB) || \
|
|
||||||
((mode) == BOND_MODE_ALB))
|
|
||||||
|
|
||||||
#define IS_IP_TARGET_UNUSABLE_ADDRESS(a) \
|
|
||||||
((htonl(INADDR_BROADCAST) == a) || \
|
|
||||||
ipv4_is_zeronet(a))
|
|
||||||
/*
|
/*
|
||||||
* Less bad way to call ioctl from within the kernel; this needs to be
|
* Less bad way to call ioctl from within the kernel; this needs to be
|
||||||
* done some other way to get the call out of interrupt context.
|
* done some other way to get the call out of interrupt context.
|
||||||
@ -89,6 +53,8 @@
|
|||||||
set_fs(fs); \
|
set_fs(fs); \
|
||||||
res; })
|
res; })
|
||||||
|
|
||||||
|
#define BOND_MODE(bond) ((bond)->params.mode)
|
||||||
|
|
||||||
/* slave list primitives */
|
/* slave list primitives */
|
||||||
#define bond_slave_list(bond) (&(bond)->dev->adj_list.lower)
|
#define bond_slave_list(bond) (&(bond)->dev->adj_list.lower)
|
||||||
|
|
||||||
@ -288,9 +254,38 @@ static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
|
|||||||
return slave->bond;
|
return slave->bond;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool bond_should_override_tx_queue(struct bonding *bond)
|
||||||
|
{
|
||||||
|
return BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP ||
|
||||||
|
BOND_MODE(bond) == BOND_MODE_ROUNDROBIN;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool bond_is_lb(const struct bonding *bond)
|
static inline bool bond_is_lb(const struct bonding *bond)
|
||||||
{
|
{
|
||||||
return BOND_MODE_IS_LB(bond->params.mode);
|
return BOND_MODE(bond) == BOND_MODE_TLB ||
|
||||||
|
BOND_MODE(bond) == BOND_MODE_ALB;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool bond_mode_uses_arp(int mode)
|
||||||
|
{
|
||||||
|
return mode != BOND_MODE_8023AD && mode != BOND_MODE_TLB &&
|
||||||
|
mode != BOND_MODE_ALB;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool bond_mode_uses_primary(int mode)
|
||||||
|
{
|
||||||
|
return mode == BOND_MODE_ACTIVEBACKUP || mode == BOND_MODE_TLB ||
|
||||||
|
mode == BOND_MODE_ALB;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool bond_uses_primary(struct bonding *bond)
|
||||||
|
{
|
||||||
|
return bond_mode_uses_primary(BOND_MODE(bond));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool bond_slave_is_up(struct slave *slave)
|
||||||
|
{
|
||||||
|
return netif_running(slave->dev) && netif_carrier_ok(slave->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void bond_set_active_slave(struct slave *slave)
|
static inline void bond_set_active_slave(struct slave *slave)
|
||||||
@ -363,6 +358,12 @@ static inline bool bond_is_active_slave(struct slave *slave)
|
|||||||
return !bond_slave_state(slave);
|
return !bond_slave_state(slave);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool bond_slave_can_tx(struct slave *slave)
|
||||||
|
{
|
||||||
|
return bond_slave_is_up(slave) && slave->link == BOND_LINK_UP &&
|
||||||
|
bond_is_active_slave(slave);
|
||||||
|
}
|
||||||
|
|
||||||
#define BOND_PRI_RESELECT_ALWAYS 0
|
#define BOND_PRI_RESELECT_ALWAYS 0
|
||||||
#define BOND_PRI_RESELECT_BETTER 1
|
#define BOND_PRI_RESELECT_BETTER 1
|
||||||
#define BOND_PRI_RESELECT_FAILURE 2
|
#define BOND_PRI_RESELECT_FAILURE 2
|
||||||
@ -399,6 +400,11 @@ static inline int slave_do_arp_validate_only(struct bonding *bond)
|
|||||||
return bond->params.arp_validate & BOND_ARP_FILTER;
|
return bond->params.arp_validate & BOND_ARP_FILTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int bond_is_ip_target_ok(__be32 addr)
|
||||||
|
{
|
||||||
|
return !ipv4_is_lbcast(addr) && !ipv4_is_zeronet(addr);
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the oldest arp which we've received on this slave for bond's
|
/* Get the oldest arp which we've received on this slave for bond's
|
||||||
* arp_targets.
|
* arp_targets.
|
||||||
*/
|
*/
|
||||||
@ -476,15 +482,6 @@ static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be3
|
|||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool slave_can_tx(struct slave *slave)
|
|
||||||
{
|
|
||||||
if (IS_UP(slave->dev) && slave->link == BOND_LINK_UP &&
|
|
||||||
bond_is_active_slave(slave))
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct bond_net {
|
struct bond_net {
|
||||||
struct net *net; /* Associated network namespace */
|
struct net *net; /* Associated network namespace */
|
||||||
struct list_head dev_list;
|
struct list_head dev_list;
|
||||||
|
Loading…
Reference in New Issue
Block a user