From patchwork Fri Jun 3 14:35:33 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?UGV0ZXIgUGFuKOa9mOWNq+W5syk=?= X-Patchwork-Id: 98589 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8CF57B6F94 for ; Sat, 4 Jun 2011 00:35:39 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751495Ab1FCOfU (ORCPT ); Fri, 3 Jun 2011 10:35:20 -0400 Received: from mail-vx0-f174.google.com ([209.85.220.174]:49446 "EHLO mail-vx0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751229Ab1FCOfT (ORCPT ); Fri, 3 Jun 2011 10:35:19 -0400 Received: by vxi39 with SMTP id 39so1417877vxi.19 for ; Fri, 03 Jun 2011 07:35:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer; bh=TsHMahInImRjxOED/UFqN3TO+D3Jcw8Omg4S94q4E3k=; b=cn8hn0k5uVNAcOKab7Nm5t6KGAbj5zar9KhQxDXt028RxrYraeDUeNAapzHUe4VlMp 0eafgSUZx+eE2HoTW0o84J3LmGh+7Zi53zSqVF+y1OAQc2n17in51aQEb4FP7T3ekQdx UbbuDq0b1WhARGIkeGnKBr3DiDjC+XXQke7mU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=wyqCUveTVgzrPasdQwuf/VOrB6qhndFIYuiHoZTlopu7NPXSDSt74LsFzRFbTxbS/B cq7zJTQyp62xkijtYVs5zaNNnndbDu7nf6gS4Ipe1ZIUPLnOP19Ndb9DqKNbR8cSATTv UAkypxZ/pJ0orqbWm9e218MZJEEFsBB+0r7bY= Received: by 10.52.90.48 with SMTP id bt16mr298117vdb.141.1307111718294; Fri, 03 Jun 2011 07:35:18 -0700 (PDT) Received: from localhost.localdomain.com ([60.247.97.98]) by mx.google.com with ESMTPS id cr7sm637293vbb.2.2011.06.03.07.35.13 (version=SSLv3 cipher=OTHER); Fri, 03 Jun 2011 07:35:17 -0700 (PDT) From: Weiping Pan Cc: Weiping Pan , Jay Vosburgh (supporter:BONDING DRIVER), Andy Gospodarek (supporter:BONDING DRIVER), netdev@vger.kernel.org (open list:BONDING DRIVER), linux-kernel@vger.kernel.org (open list) Subject: [PATCH net-next] bonding: make 802.3ad use update lacp_rate Date: Fri, 3 Jun 2011 22:35:33 +0800 Message-Id: <1307111733-4746-1-git-send-email-panweiping3@gmail.com> X-Mailer: git-send-email 1.7.4.4 To: unlisted-recipients:; (no To-header on input) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org There is a bug that when you modify lacp_rate via sysfs, 802.3ad won't use the new value of lacp_rate to transmit packets. That is because port->actor_oper_port_state isn't changed. And I want to use AD_STATE_LACP_TIMEOUT, so I move related macros from bond_3ad.c into bond_3ad.h. Signed-off-by: Weiping Pan --- drivers/net/bonding/bond_3ad.c | 48 -------------------------------------- drivers/net/bonding/bond_3ad.h | 48 ++++++++++++++++++++++++++++++++++++++ drivers/net/bonding/bond_sysfs.c | 15 +++++++++++- 3 files changed, 62 insertions(+), 49 deletions(-) diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index c7537abc..9083258 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c @@ -34,54 +34,6 @@ #include "bonding.h" #include "bond_3ad.h" -// General definitions -#define AD_SHORT_TIMEOUT 1 -#define AD_LONG_TIMEOUT 0 -#define AD_STANDBY 0x2 -#define AD_MAX_TX_IN_SECOND 3 -#define AD_COLLECTOR_MAX_DELAY 0 - -// Timer definitions(43.4.4 in the 802.3ad standard) -#define AD_FAST_PERIODIC_TIME 1 -#define AD_SLOW_PERIODIC_TIME 30 -#define AD_SHORT_TIMEOUT_TIME (3*AD_FAST_PERIODIC_TIME) -#define AD_LONG_TIMEOUT_TIME (3*AD_SLOW_PERIODIC_TIME) -#define AD_CHURN_DETECTION_TIME 60 -#define AD_AGGREGATE_WAIT_TIME 2 - -// Port state definitions(43.4.2.2 in the 802.3ad standard) -#define AD_STATE_LACP_ACTIVITY 0x1 -#define AD_STATE_LACP_TIMEOUT 0x2 -#define AD_STATE_AGGREGATION 0x4 -#define AD_STATE_SYNCHRONIZATION 0x8 -#define AD_STATE_COLLECTING 0x10 -#define AD_STATE_DISTRIBUTING 0x20 -#define AD_STATE_DEFAULTED 0x40 -#define AD_STATE_EXPIRED 0x80 - -// Port Variables definitions used by the State Machines(43.4.7 in the 802.3ad standard) -#define AD_PORT_BEGIN 0x1 -#define AD_PORT_LACP_ENABLED 0x2 -#define AD_PORT_ACTOR_CHURN 0x4 -#define AD_PORT_PARTNER_CHURN 0x8 -#define AD_PORT_READY 0x10 -#define AD_PORT_READY_N 0x20 -#define AD_PORT_MATCHED 0x40 -#define AD_PORT_STANDBY 0x80 -#define AD_PORT_SELECTED 0x100 -#define AD_PORT_MOVED 0x200 - -// Port Key definitions -// key is determined according to the link speed, duplex and -// user key(which is yet not supported) -// ------------------------------------------------------------ -// Port key : | User key | Speed |Duplex| -// ------------------------------------------------------------ -// 16 6 1 0 -#define AD_DUPLEX_KEY_BITS 0x1 -#define AD_SPEED_KEY_BITS 0x3E -#define AD_USER_KEY_BITS 0xFFC0 - //dalloun #define AD_LINK_SPEED_BITMASK_1MBPS 0x1 #define AD_LINK_SPEED_BITMASK_10MBPS 0x2 diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 0ee3f16..6ce1f6b 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h @@ -37,6 +37,54 @@ #define AD_LACP_SLOW 0 #define AD_LACP_FAST 1 +#define AD_SHORT_TIMEOUT 1 +#define AD_LONG_TIMEOUT 0 +#define AD_STANDBY 0x2 +#define AD_MAX_TX_IN_SECOND 3 +#define AD_COLLECTOR_MAX_DELAY 0 + +// Timer definitions(43.4.4 in the 802.3ad standard) +#define AD_FAST_PERIODIC_TIME 1 +#define AD_SLOW_PERIODIC_TIME 30 +#define AD_SHORT_TIMEOUT_TIME (3*AD_FAST_PERIODIC_TIME) +#define AD_LONG_TIMEOUT_TIME (3*AD_SLOW_PERIODIC_TIME) +#define AD_CHURN_DETECTION_TIME 60 +#define AD_AGGREGATE_WAIT_TIME 2 + +// Port state definitions(43.4.2.2 in the 802.3ad standard) +#define AD_STATE_LACP_ACTIVITY 0x1 +#define AD_STATE_LACP_TIMEOUT 0x2 +#define AD_STATE_AGGREGATION 0x4 +#define AD_STATE_SYNCHRONIZATION 0x8 +#define AD_STATE_COLLECTING 0x10 +#define AD_STATE_DISTRIBUTING 0x20 +#define AD_STATE_DEFAULTED 0x40 +#define AD_STATE_EXPIRED 0x80 + +// Port Variables definitions used by the State Machines(43.4.7 in the 802.3ad standard) +#define AD_PORT_BEGIN 0x1 +#define AD_PORT_LACP_ENABLED 0x2 +#define AD_PORT_ACTOR_CHURN 0x4 +#define AD_PORT_PARTNER_CHURN 0x8 +#define AD_PORT_READY 0x10 +#define AD_PORT_READY_N 0x20 +#define AD_PORT_MATCHED 0x40 +#define AD_PORT_STANDBY 0x80 +#define AD_PORT_SELECTED 0x100 +#define AD_PORT_MOVED 0x200 + +// Port Key definitions +// key is determined according to the link speed, duplex and +// user key(which is yet not supported) +// ------------------------------------------------------------ +// Port key : | User key | Speed |Duplex| +// ------------------------------------------------------------ +// 16 6 1 0 +#define AD_DUPLEX_KEY_BITS 0x1 +#define AD_SPEED_KEY_BITS 0x3E +#define AD_USER_KEY_BITS 0xFFC0 + + typedef struct mac_addr { u8 mac_addr_value[ETH_ALEN]; } __packed mac_addr_t; diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 88fcb25..2cad514 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -783,8 +783,13 @@ static ssize_t bonding_store_lacp(struct device *d, struct device_attribute *attr, const char *buf, size_t count) { - int new_value, ret = count; + int new_value, i, ret = count; struct bonding *bond = to_bond(d); + struct slave *slave; + struct port *port = NULL; + + if (!rtnl_trylock()) + return restart_syscall(); if (bond->dev->flags & IFF_UP) { pr_err("%s: Unable to update LACP rate because interface is up.\n", @@ -804,6 +809,13 @@ static ssize_t bonding_store_lacp(struct device *d, if ((new_value == 1) || (new_value == 0)) { bond->params.lacp_fast = new_value; + bond_for_each_slave(bond, slave, i) { + port = &(slave->ad_info.port); + if (new_value) + port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; + else + port->actor_oper_port_state &= ~AD_STATE_LACP_TIMEOUT; + } pr_info("%s: Setting LACP rate to %s (%d).\n", bond->dev->name, bond_lacp_tbl[new_value].modename, new_value); @@ -813,6 +825,7 @@ static ssize_t bonding_store_lacp(struct device *d, ret = -EINVAL; } out: + rtnl_unlock(); return ret; } static DEVICE_ATTR(lacp_rate, S_IRUGO | S_IWUSR,