From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 55645A0527; Sat, 18 Jul 2020 06:38:00 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CE93A1BF9E; Sat, 18 Jul 2020 06:37:58 +0200 (CEST) Received: from m15113.mail.126.com (m15113.mail.126.com [220.181.15.113]) by dpdk.org (Postfix) with ESMTP id 1DC2B1BF9A for ; Sat, 18 Jul 2020 06:37:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=XqpfA dQ7HoUSufCQybv20xpRYllNgxTgAJdGdcwlhuI=; b=DZ/5mrx98WG16cx8UjueH VnW/CeKzs9ZQK1DunhDbSGtUo4wuk16ulc6nyN59PUV9IRJDaNFMs9Iq2svSJ92f kpQvafV5h9bcn2nMWMoUbfFlcA4hKYBOmDoknKNQMVhY5ZUVP7VeNn8GseH5wgLq a1JIM+gPcfibeD7slxj36c= Received: from localhost.localdomain (unknown [115.199.253.23]) by smtp3 (Coremail) with SMTP id DcmowABn2AaXfBJflT8HHw--.12094S2; Sat, 18 Jul 2020 12:37:47 +0800 (CST) From: Weifeng Li To: dev@dpdk.org Cc: liweifeng96@126.com, xavier_huwei@163.com, xavier.huwei@huawei.com, liyunqi@huawei.com Date: Sat, 18 Jul 2020 12:35:38 +0800 Message-Id: <20200718043538.2315-1-liweifeng96@126.com> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20200718040531.2164-1-liweifeng96@126.com> References: <20200718040531.2164-1-liweifeng96@126.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: DcmowABn2AaXfBJflT8HHw--.12094S2 X-Coremail-Antispam: 1Uf129KBjvJXoW3WFW3uw4UXF1DKryUZF4UXFb_yoW7XFW8pF s8KrsxtFyqqF42gw17Jw48uw15Cw18J3W7K347A3yrZFs0kF18t3WxKrW0vFWDZrW8JFy3 ZFZ0k3W7Kan8AaDanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jEFAJUUUUU= X-Originating-IP: [115.199.253.23] X-CM-SenderInfo: 5olzvx5ihqwmaw6rjloofrz/1tbirxxl-lpD986OTgAAsI Subject: [dpdk-dev] [PATCH v4] net/bonding: change the state machine to defaulted X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" A dpdk bonding 802.3ad network as follows: +----------+ +-----------+ |dpdk lacp |bond1.1 <------> bond2.1|switch lacp| | |bond1.2 <------> bond2.2| | +----------+ +-----------+ If a fiber optic go wrong about single pass during normal running like this: bond1.2 -----> bond2.2 ok bond1.2 <--x-- bond2.2 error: bond1.2 receive no LACPDU Some packets from switch to dpdk will choose bond2.2 and lost. DPDK lacp state machine will transits to the expired state if no LACPDU is received before the current_while_timer expires. But if no LACPDU is received before the current_while_timer expires again, DPDK lacp state machine has no change. Bond2.2 can not change to inactive depend on the received LACPDU. According to IEEE 802.3ad, if no lacpdu is received before the current_while_timer expires again, the state machine should transits from expired to defaulted. Bond2.2 will change to inactive depend on the LACPDU with defaulted state. This patch adds a state machine change from expired to defaulted when no lacpdu is received before the current_while_timer expires again according to IEEE 802.3ad: If no LACPDU is received before the current_while timer expires again, the state machine transits to the DEFAULTED state. The record Default function overwrites the current operational parameters for the Partner with administratively configured values. This allows configuration of aggregations and individual links when no protocol partner is present, while still permitting an active partner to override default settings. The update_Default_Selected function sets the Selected variable FALSE if the Link Aggregation Group has changed. Since all operational parameters are now set to locally administered values there can be no disagreement as to the Link Aggregation Group, so the Matched variable is set TRUE. The relevant description is in the chapter 43.4.12 of the link below: https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=850426 Signed-off-by: Weifeng Li --- v1 -> v2: adjust the formate of commit log --- v2 -> v3: 1. adjust coding style issue. 2. add description about partner_admin from IEEE spec. --- v3 -> v4 1. adjust coding style issue: Missing Signed-off-by --- drivers/net/bonding/eth_bond_8023ad_private.h | 3 +++ drivers/net/bonding/rte_eth_bond_8023ad.c | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/net/bonding/eth_bond_8023ad_private.h b/drivers/net/bonding/eth_bond_8023ad_private.h index 6e44ffd..9b5738a 100644 --- a/drivers/net/bonding/eth_bond_8023ad_private.h +++ b/drivers/net/bonding/eth_bond_8023ad_private.h @@ -50,6 +50,7 @@ #define SM_FLAGS_MOVED 0x0100 #define SM_FLAGS_PARTNER_SHORT_TIMEOUT 0x0200 #define SM_FLAGS_NTT 0x0400 +#define SM_FLAGS_EXPIRED 0x0800 #define BOND_LINK_FULL_DUPLEX_KEY 0x01 #define BOND_LINK_SPEED_KEY_10M 0x02 @@ -103,6 +104,8 @@ struct port { /** The operational Partner's port parameters */ struct port_params partner; + /** Partner administrative parameter values */ + struct port_params partner_admin; /* Additional port parameters not listed in documentation */ /** State machine flags */ diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c index 3991825..3c2c7bf 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.c +++ b/drivers/net/bonding/rte_eth_bond_8023ad.c @@ -356,16 +356,28 @@ rx_machine(struct bond_dev_private *internals, uint16_t slave_id, timer_set(&port->current_while_timer, timeout); ACTOR_STATE_CLR(port, EXPIRED); + SM_FLAG_CLR(port, EXPIRED); return; /* No state change */ } /* If CURRENT state timer is not running (stopped or expired) * transit to EXPIRED state from DISABLED or CURRENT */ if (!timer_is_running(&port->current_while_timer)) { - ACTOR_STATE_SET(port, EXPIRED); - PARTNER_STATE_CLR(port, SYNCHRONIZATION); - PARTNER_STATE_SET(port, LACP_SHORT_TIMEOUT); - timer_set(&port->current_while_timer, internals->mode4.short_timeout); + if (SM_FLAG(port, EXPIRED)) { + port->selected = UNSELECTED; + memcpy(&port->partner, &port->partner_admin, + sizeof(struct port_params)); + record_default(port); + ACTOR_STATE_CLR(port, EXPIRED); + timer_cancel(&port->current_while_timer); + } else { + SM_FLAG_SET(port, EXPIRED); + ACTOR_STATE_SET(port, EXPIRED); + PARTNER_STATE_CLR(port, SYNCHRONIZATION); + PARTNER_STATE_SET(port, LACP_SHORT_TIMEOUT); + timer_set(&port->current_while_timer, + internals->mode4.short_timeout); + } } } @@ -1021,6 +1033,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, port->actor.port_number = rte_cpu_to_be_16(slave_id + 1); memcpy(&port->partner, &initial, sizeof(struct port_params)); + memcpy(&port->partner_admin, &initial, sizeof(struct port_params)); /* default states */ port->actor_state = STATE_AGGREGATION | STATE_LACP_ACTIVE | STATE_DEFAULTED; -- 2.9.5