From: Flavio Leitner <fbl@redhat.com>
To: Stephen Hemminger <shemminger@vyatta.com>
Cc: Jay Vosburgh <fubar@us.ibm.com>,
Andy Gospodarek <andy@greyhouse.net>,
David Miller <davem@davemloft.net>,
netdev@vger.kernel.org
Subject: Re: [PATCH net-next] bonding: add min links parameter to 802.3ad
Date: Wed, 22 Jun 2011 16:40:30 -0300 [thread overview]
Message-ID: <4E02452E.2030307@redhat.com> (raw)
In-Reply-To: <20110622105408.06fd4788@nehalam.ftrdhcpuser.net>
On 06/22/2011 02:54 PM, Stephen Hemminger wrote:
> This adds support for a configuring the minimum number of links that
> must be active before asserting carrier. It is similar to the Cisco
> EtherChannel min-links feature. This allows setting the minimum number
> of member ports that must be up (link-up state) before marking the
> bond device as up (carrier on). This is useful for situations where
> higher level services such as clustering want to ensure a minimum
> number of low bandwidth links are active before switchover.
>
> This is a prototype, did some basic testing but has not been
> tested with other switches.
>
> See:
> http://bugzilla.vyatta.com/show_bug.cgi?id=7196
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
> ---
> drivers/net/bonding/bond_3ad.c | 8 ++++++--
> drivers/net/bonding/bond_main.c | 5 +++++
> drivers/net/bonding/bond_procfs.c | 1 +
> drivers/net/bonding/bond_sysfs.c | 35 +++++++++++++++++++++++++++++++++++
> drivers/net/bonding/bonding.h | 1 +
> 5 files changed, 48 insertions(+), 2 deletions(-)
>
> --- a/drivers/net/bonding/bond_main.c 2011-06-22 09:06:40.895998636 -0700
> +++ b/drivers/net/bonding/bond_main.c 2011-06-22 10:11:52.855974841 -0700
> @@ -98,6 +98,7 @@ static char *mode;
> static char *primary;
> static char *primary_reselect;
> static char *lacp_rate;
> +static int min_links;
> static char *ad_select;
> static char *xmit_hash_policy;
> static int arp_interval = BOND_LINK_ARP_INTERV;
> @@ -150,6 +151,9 @@ module_param(ad_select, charp, 0);
> MODULE_PARM_DESC(ad_select, "803.ad aggregation selection logic; "
> "0 for stable (default), 1 for bandwidth, "
> "2 for count");
> +module_param(min_links, int, 0);
> +MODULE_PARM_DESC(min_links, "Minimum number of available links before turning on carrier");
> +
> module_param(xmit_hash_policy, charp, 0);
> MODULE_PARM_DESC(xmit_hash_policy, "balance-xor and 802.3ad hashing method; "
> "0 for layer 2 (default), 1 for layer 3+4, "
> @@ -4798,6 +4802,7 @@ static int bond_check_params(struct bond
> params->tx_queues = tx_queues;
> params->all_slaves_active = all_slaves_active;
> params->resend_igmp = resend_igmp;
> + params->min_links = min_links;
>
> if (primary) {
> strncpy(params->primary, primary, IFNAMSIZ);
> --- a/drivers/net/bonding/bond_procfs.c 2011-06-22 09:17:04.391998454 -0700
> +++ b/drivers/net/bonding/bond_procfs.c 2011-06-22 09:27:09.815997950 -0700
> @@ -125,6 +125,7 @@ static void bond_info_show_master(struct
> seq_puts(seq, "\n802.3ad info\n");
> seq_printf(seq, "LACP rate: %s\n",
> (bond->params.lacp_fast) ? "fast" : "slow");
> + seq_printf(seq, "Min links: %d\n", bond->params.min_links);
> seq_printf(seq, "Aggregator selection policy (ad_select): %s\n",
> ad_select_tbl[bond->params.ad_select].modename);
>
> --- a/drivers/net/bonding/bond_sysfs.c 2011-06-22 09:04:50.295998865 -0700
> +++ b/drivers/net/bonding/bond_sysfs.c 2011-06-22 10:24:11.287947057 -0700
> @@ -819,6 +819,39 @@ out:
> static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR,
> bonding_show_lacp, bonding_store_lacp);
>
> +
Other similar parts uses just one blank line.
> +static ssize_t bonding_show_min_links(struct device *d,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct bonding *bond = to_bond(d);
> +
> + return sprintf(buf, "%d\n", bond->params.min_links);
> +}
> +
> +static ssize_t bonding_store_min_links(struct device *d,
> + struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + struct bonding *bond = to_bond(d);
> + int ret;
> + unsigned int new_value;
> +
> + ret = kstrtouint(buf, 0, &new_value);
> + if (ret < 0) {
> + pr_err("%s: Ignoring invalid min links value %s.\n",
> + bond->dev->name, buf);
> + return ret;
> + }
> +
> + pr_info("%s: Setting min links value to %u\n",
> + bond->dev->name, new_value);
> + bond->params.min_links = new_value;
> + return count;
> +}
> +static DEVICE_ATTR(min_links, S_IRUGO | S_IWUSR,
> + bonding_show_min_links, bonding_store_min_links);
> +
> static ssize_t bonding_show_ad_select(struct device *d,
> struct device_attribute *attr,
> char *buf)
> @@ -863,6 +896,7 @@ out:
> static DEVICE_ATTR(ad_select, S_IRUGO | S_IWUSR,
> bonding_show_ad_select, bonding_store_ad_select);
>
> +
Same here.
> /*
> * Show and set the number of peer notifications to send after a failover event.
> */
> @@ -1601,6 +1635,7 @@ static struct attribute *per_bond_attrs[
> &dev_attr_queue_id.attr,
> &dev_attr_all_slaves_active.attr,
> &dev_attr_resend_igmp.attr,
> + &dev_attr_min_links.attr,
> NULL,
> };
>
> --- a/drivers/net/bonding/bonding.h 2011-06-22 09:05:32.351998841 -0700
> +++ b/drivers/net/bonding/bonding.h 2011-06-22 09:27:23.959999290 -0700
> @@ -147,6 +147,7 @@ struct bond_params {
> int updelay;
> int downdelay;
> int lacp_fast;
> + unsigned int min_links;
> int ad_select;
> char primary[IFNAMSIZ];
> int primary_reselect;
> --- a/drivers/net/bonding/bond_3ad.c 2011-06-22 08:43:25.599999586 -0700
> +++ b/drivers/net/bonding/bond_3ad.c 2011-06-22 09:44:11.815997557 -0700
> @@ -2342,8 +2342,12 @@ void bond_3ad_handle_link_change(struct
> */
> int bond_3ad_set_carrier(struct bonding *bond)
> {
> - if (__get_active_agg(&(SLAVE_AD_INFO(bond->first_slave).aggregator))) {
> - if (!netif_carrier_ok(bond->dev)) {
> + struct aggregator *active;
> +
> + active = __get_active_agg(&(SLAVE_AD_INFO(bond->first_slave).aggregator));
> + if (active) {
> + if (active->num_of_ports >= bond->params.min_links &&
> + !netif_carrier_ok(bond->dev)) {
> netif_carrier_on(bond->dev);
> return 1;
I'm not seeing how this will handle when one interface goes down leaving
the aggregator without the minimum number of links because you still have
an aggregator and link, so the resulting link wouldn't change.
I thought in something like this:
@@ -2345,18 +2345,31 @@ void bond_3ad_handle_link_change(struct slave *slave, char link)
*/
int bond_3ad_set_carrier(struct bonding *bond)
{
- if (__get_active_agg(&(SLAVE_AD_INFO(bond->first_slave).aggregator))) {
- if (!netif_carrier_ok(bond->dev)) {
- netif_carrier_on(bond->dev);
- return 1;
+ struct aggregator *active;
+
+ active = __get_active_agg(&(SLAVE_AD_INFO(bond->first_slave).aggregator));
+
+ if (active) {
+ if (active->num_of_ports >= bond->params.min_links) {
+ if (!netif_carrier_ok(bond->dev)) {
+ netif_carrier_on(bond->dev);
+ return 1;
+ }
+ }
+ else {
+ /* link is up without enough slaves, disable it */
+ if (netif_carrier_ok(bond->dev)) {
+ netif_carrier_off(bond->dev);
+ return 1;
+ }
}
- return 0;
}
- if (netif_carrier_ok(bond->dev)) {
+ if (!active && netif_carrier_ok(bond->dev)) {
netif_carrier_off(bond->dev);
return 1;
}
+
return 0;
}
what you think?
thanks,
fbl
next prev parent reply other threads:[~2011-06-22 19:40 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-22 17:54 [PATCH net-next] bonding: add min links parameter to 802.3ad Stephen Hemminger
2011-06-22 19:40 ` Flavio Leitner [this message]
2011-06-22 19:54 ` Stephen Hemminger
2011-06-22 21:35 ` Flavio Leitner
2011-06-23 1:58 ` Andy Gospodarek
2011-06-23 9:13 ` David Miller
2011-06-22 19:50 ` Andy Gospodarek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E02452E.2030307@redhat.com \
--to=fbl@redhat.com \
--cc=andy@greyhouse.net \
--cc=davem@davemloft.net \
--cc=fubar@us.ibm.com \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).