/* Link status. */
long long delay_expires; /* Time after which 'enabled' may change. */
bool enabled; /* May be chosen for flows? */
- bool lacp_may_enable; /* LACP considers this interface bondable. */
+ bool may_enable; /* Client considers this slave bondable. */
tag_type tag; /* Tag associated with this slave. */
/* Rebalancing info. Used only by bond_rebalance(). */
}
}
-/* Should be called on each slave in 'bond' before bond_run() to indicate the
- * results of lacp_slave_may_enable() on 'slave_'. */
+/* Should be called on each slave in 'bond' before bond_run() to indicate
+ * whether or not 'slave_' may be enabled. This function is intended to allow
+ * other protocols to have some impact on bonding decisions. For example LACP
+ * or high level link monitoring protocols may decide that a given slave should
+ * not be able to send traffic. */
void
-bond_slave_set_lacp_may_enable(struct bond *bond, void *slave_,
- bool may_enable)
+bond_slave_set_may_enable(struct bond *bond, void *slave_, bool may_enable)
{
- bond_slave_lookup(bond, slave_)->lacp_may_enable = may_enable;
+ bond_slave_lookup(bond, slave_)->may_enable = may_enable;
}
/* Performs periodic maintenance on 'bond'. The caller must provide 'tags' to
slave->delay_expires - time_msec());
}
- ds_put_format(&ds, "\tlacp_may_enable: %s\n",
- slave->lacp_may_enable ? "true" : "false");
+ ds_put_format(&ds, "\tmay_enable: %s\n",
+ slave->may_enable ? "true" : "false");
if (!bond_is_balanced(bond)) {
continue;
struct bond *bond = slave->bond;
bool up;
- up = netdev_get_carrier(slave->netdev) && slave->lacp_may_enable;
+ up = netdev_get_carrier(slave->netdev) && slave->may_enable;
if ((up == slave->enabled) != (slave->delay_expires == LLONG_MAX)) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
VLOG_INFO_RL(&rl, "interface %s: link state %s",
best = NULL;
HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) {
if (slave->delay_expires != LLONG_MAX
- && slave->lacp_may_enable
+ && slave->may_enable
&& (!best || slave->delay_expires < best->delay_expires)) {
best = slave;
}
void bond_run(struct bond *, struct tag_set *, bool lacp_negotiated);
void bond_wait(struct bond *);
-/* LACP. */
-void bond_slave_set_lacp_may_enable(struct bond *, void *slave_,
- bool may_enable);
+void bond_slave_set_may_enable(struct bond *, void *slave_, bool may_enable);
/* Special MAC learning support for SLB bonding. */
bool bond_should_send_learning_packets(struct bond *);
LIST_FOR_EACH (port, bundle_node, &bundle->ports) {
bool may_enable = lacp_slave_may_enable(bundle->lacp, port);
- bond_slave_set_lacp_may_enable(bundle->bond, port, may_enable);
+
+ if (may_enable && port->cfm) {
+ may_enable = !cfm_get_fault(port->cfm);
+ }
+ bond_slave_set_may_enable(bundle->bond, port, may_enable);
}
bond_run(bundle->bond, &bundle->ofproto->revalidate_set,