From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 873FCA054D; Wed, 17 Feb 2021 17:27:11 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F3DF34069D; Wed, 17 Feb 2021 17:27:10 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 363AA40690; Wed, 17 Feb 2021 17:27:07 +0100 (CET) IronPort-SDR: /wp4Dtm3onbnAa2u2Wi11VDRZoKhiMD94kQi9MFFggnxjIOQ5FmBzZKtsm2fARnFfWRL4jSrsN FMzDX9EIi7jA== X-IronPort-AV: E=McAfee;i="6000,8403,9897"; a="247310784" X-IronPort-AV: E=Sophos;i="5.81,184,1610438400"; d="scan'208";a="247310784" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2021 08:27:05 -0800 IronPort-SDR: O9JYvlrde3uvalNqqiITqKDuRv79ht5XeK3hlRtzHWn1xs6fUF2f6lGq/fWQ3kfHbytn+BqRrK 9Az/ROllULAA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,184,1610438400"; d="scan'208";a="419135602" Received: from silpixa00399752.ir.intel.com (HELO silpixa00399752.ger.corp.intel.com) ([10.237.222.27]) by fmsmga004.fm.intel.com with ESMTP; 17 Feb 2021 08:27:02 -0800 From: Ferruh Yigit To: Chas Williams , "Min Hu (Connor)" , Liang Zhang Cc: Ferruh Yigit , dev@dpdk.org, Vadim Podovinnikov , stable@dpdk.org, Declan Doherty Date: Wed, 17 Feb 2021 16:26:55 +0000 Message-Id: <20210217162656.1983277-1-ferruh.yigit@intel.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20191126115508.11138-1-podovinnikov@protei.ru> References: <20191126115508.11138-1-podovinnikov@protei.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v3] net/bonding: fix LACP system address check X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" From: Vadim Podovinnikov In bond (LACP) we have several NICs (ports), when we have negotiation with peer about what port we prefer, we send information about what system we preferred in partner system name field. Peer also sends us what partner system name it prefer. When we receive a message from it we must compare its preferred system name with our system name, but not with our port mac address In my test I have several problems with that: 1. If master port (mac address same as system address) shuts down (I have two ports) I loose connection 2. If secondary port (mac address not same as system address) receives message before master port, my connection is not established. Fixes: 56cbc0817399 ("net/bonding: fix LACP negotiation") Cc: stable@dpdk.org Signed-off-by: Vadim Podovinnikov --- Cc: zhangliang@bigo.sg Cc: Declan Doherty v3: Re-sent with rebase * Patch title updated, commit log updated with info shared in email * Sign-off updated with full name * Debug log slightly updated * Syntax slightly updated --- drivers/net/bonding/rte_eth_bond_8023ad.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c index 5fe004e551de..128754f4595a 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.c +++ b/drivers/net/bonding/rte_eth_bond_8023ad.c @@ -804,19 +804,34 @@ rx_machine_update(struct bond_dev_private *internals, uint16_t slave_id, struct rte_mbuf *lacp_pkt) { struct lacpdu_header *lacp; struct lacpdu_actor_partner_params *partner; + struct port *port, *agg; if (lacp_pkt != NULL) { lacp = rte_pktmbuf_mtod(lacp_pkt, struct lacpdu_header *); RTE_ASSERT(lacp->lacpdu.subtype == SLOW_SUBTYPE_LACP); partner = &lacp->lacpdu.partner; + port = &bond_mode_8023ad_ports[slave_id]; + agg = &bond_mode_8023ad_ports[port->aggregator_port_id]; + if (rte_is_zero_ether_addr(&partner->port_params.system) || rte_is_same_ether_addr(&partner->port_params.system, - &internals->mode4.mac_addr)) { + &agg->actor.system)) { /* This LACP frame is sending to the bonding port * so pass it to rx_machine. */ rx_machine(internals, slave_id, &lacp->lacpdu); + } else { + char preferred_system_name[RTE_ETHER_ADDR_FMT_SIZE]; + char self_system_name[RTE_ETHER_ADDR_FMT_SIZE]; + + rte_ether_format_addr(preferred_system_name, + RTE_ETHER_ADDR_FMT_SIZE, &partner->port_params.system); + rte_ether_format_addr(self_system_name, + RTE_ETHER_ADDR_FMT_SIZE, &agg->actor.system); + MODE4_DEBUG("preferred partner system %s " + "is not equal with self system: %s\n", + preferred_system_name, self_system_name); } rte_pktmbuf_free(lacp_pkt); } else -- 2.29.2