From patchwork Tue Jul 7 01:51:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Weifeng Li X-Patchwork-Id: 73357 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1C5E1A00BE; Tue, 7 Jul 2020 03:51:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1A1E71DCAE; Tue, 7 Jul 2020 03:51:34 +0200 (CEST) Received: from huawei.com (szxga08-in.huawei.com [45.249.212.255]) by dpdk.org (Postfix) with ESMTP id 5AA8B1DC93 for ; Tue, 7 Jul 2020 03:51:32 +0200 (CEST) Received: from DGGEMM403-HUB.china.huawei.com (unknown [172.30.72.57]) by Forcepoint Email with ESMTP id C33F4ECC141C31BE3961; Tue, 7 Jul 2020 09:51:30 +0800 (CST) Received: from DGGEMM423-HUB.china.huawei.com (10.1.198.40) by DGGEMM403-HUB.china.huawei.com (10.3.20.211) with Microsoft SMTP Server (TLS) id 14.3.487.0; Tue, 7 Jul 2020 09:51:29 +0800 Received: from DGGEMM527-MBS.china.huawei.com ([169.254.5.197]) by dggemm423-hub.china.huawei.com ([10.1.198.40]) with mapi id 14.03.0487.000; Tue, 7 Jul 2020 09:51:22 +0800 From: "Liyunqi (FENIX)" To: "dev@dpdk.org" CC: "Huwei (Xavier)" , "chas3@att.com" , Songyujin , "Liweifeng (DOPRA MSS)" Thread-Topic: [RFC PATCH] net/bonding: change the state machine to defaulted Thread-Index: AQHWUPxZdw4XEnY2tECPQle2v0FLEqj7X5Kw Date: Tue, 7 Jul 2020 01:51:21 +0000 Message-ID: References: <20200703133146.22195-1-liweifeng2@huawei.com> In-Reply-To: <20200703133146.22195-1-liweifeng2@huawei.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.174.105.44] MIME-Version: 1.0 X-CFilter-Loop: Reflected Subject: [dpdk-dev] [RFC PATCH] 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 |slave1 <------> port1|switch lacp| | |slave2 <------> port2| | +----------+ +-----------+ If a fiber optic go wrong about single pass during normal runing like this: slave2 -----> port2 ok slave2 <----- port2 error: salve2 receive no LACPDU Some packets from switch to dpdk will choose port2 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. Port2 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. Port2 will change to inactive depend on the LACPDU with defaulted state. This Patch add 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 recordDefault 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 --- drivers/net/bonding/eth_bond_8023ad_private.h | 2 ++ drivers/net/bonding/rte_eth_bond_8023ad.c | 21 +++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) -- 1.8.3.1 ----- This e-mail and its attachments contain confidential information from HUAWEI, which is intended only for the person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction, or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender by phone or email immediately and delete it! ----- diff --git a/drivers/net/bonding/eth_bond_8023ad_private.h b/drivers/net/bonding/eth_bond_8023ad_private.h index 6e44ffd..76f8b8d 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,7 @@ struct port { /** The operational Partner's port parameters */ struct port_params partner; + 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 b77a37d..bfa418d 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.c +++ b/drivers/net/bonding/rte_eth_bond_8023ad.c @@ -356,16 +356,28 @@ 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); + } } } @@ -1020,6 +1032,7 @@ 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;