From patchwork Tue Aug 8 12:56:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacek Piasecki X-Patchwork-Id: 27489 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 747BD2BE9; Tue, 8 Aug 2017 14:58:43 +0200 (CEST) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 703842B9D for ; Tue, 8 Aug 2017 14:58:40 +0200 (CEST) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga104.jf.intel.com with ESMTP; 08 Aug 2017 05:58:39 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.41,343,1498546800"; d="scan'208"; a="1160508787" Received: from gklab-246-073.igk.intel.com (HELO Sent) ([10.217.246.73]) by orsmga001.jf.intel.com with SMTP; 08 Aug 2017 05:58:36 -0700 Received: by Sent (sSMTP sendmail emulation); Tue, 08 Aug 2017 14:56:55 +0200 From: Jacek Piasecki To: dev@dpdk.org Cc: danielx.t.mrzyglod@intel.com, michalx.k.jastrzebski@intel.com, Jacek Piasecki Date: Tue, 8 Aug 2017 14:56:43 +0200 Message-Id: <1502197003-54360-1-git-send-email-jacekx.piasecki@intel.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [PATCH] net/bonding: fix bonding in 8023ad mode 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" This patch blocks possibility to set master bonding by rte_eth_bond_mode_set() in 802.3ad mode, as the API doesn't prevent this. Fixes: 6d72657ce379 ("net/bonding: add other aggregator modes") Cc: danielx.t.mrzyglod@intel.com Signed-off-by: Jacek Piasecki Reviewed-by: Radu Nicolau --- drivers/net/bonding/rte_eth_bond_api.c | 29 ++++++++++++++++++++++++++++- drivers/net/bonding/rte_eth_bond_private.h | 3 +++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c index de1d9e0..d6aaf07 100644 --- a/drivers/net/bonding/rte_eth_bond_api.c +++ b/drivers/net/bonding/rte_eth_bond_api.c @@ -63,6 +63,25 @@ valid_bonded_port_id(uint8_t port_id) } int +check_for_master_bonded_ethdev(const struct rte_eth_dev *eth_dev) +{ + int i; + struct bond_dev_private *internals; + + if (check_for_bonded_ethdev(eth_dev) != 0) + return 0; + + internals = eth_dev->data->dev_private; + + /* Check if any of slave devices is a bonded device */ + for (i = 0; i < internals->slave_count; i++) + if (valid_bonded_port_id(internals->slaves[i].port_id) == 0) + return 1; + + return 0; +} + +int valid_slave_port_id(uint8_t port_id, uint8_t mode) { RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1); @@ -490,10 +509,18 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id) int rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode) { + struct rte_eth_dev *bonded_eth_dev; + if (valid_bonded_port_id(bonded_port_id) != 0) return -1; - return bond_ethdev_mode_set(&rte_eth_devices[bonded_port_id], mode); + bonded_eth_dev = &rte_eth_devices[bonded_port_id]; + + if (check_for_master_bonded_ethdev(bonded_eth_dev) != 0 && + mode == BONDING_MODE_8023AD) + return -1; + + return bond_ethdev_mode_set(bonded_eth_dev, mode); } int diff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h index 1fe6ff8..4dd7e5f 100644 --- a/drivers/net/bonding/rte_eth_bond_private.h +++ b/drivers/net/bonding/rte_eth_bond_private.h @@ -184,6 +184,9 @@ extern const struct eth_dev_ops default_dev_ops; int check_for_bonded_ethdev(const struct rte_eth_dev *eth_dev); +int +check_for_master_bonded_ethdev(const struct rte_eth_dev *eth_dev); + /* Search given slave array to find position of given id. * Return slave pos or slaves_count if not found. */ static inline uint8_t