From 296f651909b7ea4de7a9450c0787fc3c4051efc1 Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Mon, 16 May 2011 17:19:48 -0700 Subject: [PATCH] bond: Use CFM for slave status. With this patch, if CFM is configured on a slave, and in a faulted state, it will be disabled by the bond module. --- lib/bond.c | 22 ++++++++++++---------- lib/bond.h | 4 +--- ofproto/ofproto-dpif.c | 6 +++++- vswitchd/vswitch.xml | 4 +++- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/bond.c b/lib/bond.c index 4e68fc86..9a688be6 100644 --- a/lib/bond.c +++ b/lib/bond.c @@ -64,7 +64,7 @@ struct bond_slave { /* 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(). */ @@ -396,13 +396,15 @@ bond_slave_unregister(struct bond *bond, const void *slave_) } } -/* 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 @@ -964,8 +966,8 @@ bond_unixctl_show(struct unixctl_conn *conn, 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; @@ -1271,7 +1273,7 @@ bond_link_status_update(struct bond_slave *slave, struct tag_set *tags) 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", @@ -1420,7 +1422,7 @@ bond_choose_slave(const struct bond *bond) 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; } diff --git a/lib/bond.h b/lib/bond.h index 56ca5b98..f9554326 100644 --- a/lib/bond.h +++ b/lib/bond.h @@ -71,9 +71,7 @@ void bond_slave_unregister(struct bond *, const void *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 *); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 419e8240..63bc3799 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1133,7 +1133,11 @@ bundle_run(struct ofbundle *bundle) 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, diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 21486468..85bf1627 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -1293,7 +1293,9 @@ Indicates a connectivity fault triggered by an inability to receive - heartbeats from the remote endpoint. + heartbeats from the remote endpoint. When a fault is triggered on + s participating in bonds, they will be + disabled. -- 2.30.2