Commit bd508065 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parents 31ff6aa5 8557cd74
...@@ -192,7 +192,7 @@ static inline void __enable_port(struct port *port) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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[]) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 ...@@ -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) ...@@ -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 "
......
This diff is collapsed.
...@@ -56,7 +56,7 @@ static int bond_fill_slave_info(struct sk_buff *skb, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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;
......
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