From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from relay-out4.mail.masterhost.ru (relay-out4.mail.masterhost.ru [83.222.12.14]) by dpdk.org (Postfix) with ESMTP id 775C914EC for ; Mon, 18 Jun 2018 14:27:19 +0200 (CEST) Received: from [37.139.80.50] (helo=h5.therouter.net) by relay4.mail.masterhost.ru with esmtpa envelope from authenticated with alex@therouter.net message id 1fUtFc-0008Df-Mg; Mon, 18 Jun 2018 15:27:18 +0300 Received: by h5.therouter.net (sSMTP sendmail emulation); Mon, 18 Jun 2018 15:27:16 +0300 Date: Mon, 18 Jun 2018 15:27:16 +0300 To: Chas Williams , "dev@dpdk.org" From: Alex Kiselev X-KLMS-Rule-ID: 1 X-KLMS-Message-Action: clean X-KLMS-AntiSpam-Lua-Profiles: 125966 [Jun 18 2018] X-KLMS-AntiSpam-Version: 5.8.1.0 X-KLMS-AntiSpam-Envelope-From: alex@therouter.net X-KLMS-AntiSpam-Rate: 0 X-KLMS-AntiSpam-Status: not_detected X-KLMS-AntiSpam-Method: none X-KLMS-AntiSpam-Info: LuaCore: 145 145 8115312454756d54ead40e39a46e0295eb9efe85, {rep_avail}, {msgid_missed_heavy}, DmarcAF: none X-MS-Exchange-Organization-SCL: -1 X-KLMS-AntiSpam-Interceptor-Info: scan successful X-KLMS-AntiPhishing: not scanned, disabled by settings X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.2.16, not scanned, license restriction Subject: [dpdk-dev] [PATCH v2] net/bonding: add add/remove mac addrs 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: , X-List-Received-Date: Mon, 18 Jun 2018 12:27:19 -0000 Content-Type: text/plain; charset="UTF-8" Message-ID: <20180618122716.Mji_aI-9v6CF-56ucBBW71-rsqgtdAfRk6x3W5ybutw@z> add functions to add/remove MAC addresses Signed-off-by: Alex Kiselev --- drivers/net/bonding/rte_eth_bond_api.c | 8 +- drivers/net/bonding/rte_eth_bond_pmd.c | 123 ++++++++++++++++++++++++++++- drivers/net/bonding/rte_eth_bond_private.h | 8 ++ 3 files changed, 134 insertions(+), 5 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c index d558df8b9..43c148ba5 100644 --- a/drivers/net/bonding/rte_eth_bond_api.c +++ b/drivers/net/bonding/rte_eth_bond_api.c @@ -387,9 +387,12 @@ __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id) /* Add slave details to bonded device */ slave_eth_dev->data->dev_flags |= RTE_ETH_DEV_BONDED_SLAVE; - /* Update all slave devices MACs*/ + /* Update all slave devices MACs */ mac_address_slaves_update(bonded_eth_dev); + /* Add additional MAC addresses to the slave */ + slave_add_mac_addresses(bonded_eth_dev, slave_port_id); + /* Register link status change callback with bonded device pointer as * argument*/ rte_eth_dev_callback_register(slave_port_id, RTE_ETH_EVENT_INTR_LSC, @@ -491,6 +494,9 @@ __eth_bond_slave_remove_lock_free(uint16_t bonded_port_id, rte_eth_dev_default_mac_addr_set(slave_port_id, &(internals->slaves[slave_idx].persisted_mac_addr)); + /* remove additional MAC addresses from the slave */ + slave_remove_mac_addresses(bonded_eth_dev, slave_port_id); + /* * Remove bond device flows from slave device. * Note: don't restore flow isolate mode. diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index 02d94b1b1..51fc4840f 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -25,6 +25,7 @@ #define REORDER_PERIOD_MS 10 #define DEFAULT_POLLING_INTERVAL_10_MS (10) +#define BOND_MAX_MAC_ADDRS 16 #define HASH_L4_PORTS(h) ((h)->src_port ^ (h)->dst_port) @@ -1588,6 +1589,56 @@ mac_address_set(struct rte_eth_dev *eth_dev, struct ether_addr *new_mac_addr) return 0; } +static const struct ether_addr null_mac_addr; + +/* + * Add additional MAC addresses to the slave + */ +int +slave_add_mac_addresses(struct rte_eth_dev *bonded_eth_dev, + uint16_t slave_port_id) +{ + int i, ret; + struct ether_addr *mac_addr; + + /* add additional MACs to the slave */ + for (i = 1; i < BOND_MAX_MAC_ADDRS; i++) { + mac_addr = &bonded_eth_dev->data->mac_addrs[i]; + if (is_same_ether_addr(mac_addr, &null_mac_addr)) + break; + + ret = rte_eth_dev_mac_addr_add(slave_port_id, mac_addr, 0); + if (ret < 0) + return ret; + } + + return 0; +} + +/* + * Remove additional MAC addresses from the slave + */ +int +slave_remove_mac_addresses(struct rte_eth_dev *bonded_eth_dev, + uint16_t slave_port_id) +{ + int i, ret; + struct ether_addr *mac_addr; + + /* add additional MACs to the slave */ + for (i = 1; i < BOND_MAX_MAC_ADDRS; i++) { + mac_addr = &bonded_eth_dev->data->mac_addrs[i]; + if (is_same_ether_addr(mac_addr, &null_mac_addr)) + break; + + ret = rte_eth_dev_mac_addr_remove(slave_port_id, mac_addr); + if (ret < 0) + return ret; + } + + return 0; +} + int mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev) { @@ -2219,7 +2270,7 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) uint16_t max_nb_rx_queues = UINT16_MAX; uint16_t max_nb_tx_queues = UINT16_MAX; - dev_info->max_mac_addrs = 1; + dev_info->max_mac_addrs = BOND_MAX_MAC_ADDRS; dev_info->max_rx_pktlen = internals->candidate_max_rx_pktlen ? internals->candidate_max_rx_pktlen : @@ -2905,6 +2956,65 @@ bond_filter_ctrl(struct rte_eth_dev *dev __rte_unused, return -ENOTSUP; } +static int +bond_ethdev_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr, + __rte_unused uint32_t index, uint32_t vmdq) +{ + struct rte_eth_dev *slave_eth_dev; + struct bond_dev_private *internals = dev->data->dev_private; + int ret, i; + + rte_spinlock_lock(&internals->lock); + + for (i = 0; i < internals->slave_count; i++) { + slave_eth_dev = &rte_eth_devices[internals->slaves[i].port_id]; + if (*slave_eth_dev->dev_ops->mac_addr_add == NULL) { + ret = -ENOTSUP; + goto end; + } + } + + for (i = 0; i < internals->slave_count; i++) { + ret = rte_eth_dev_mac_addr_add(internals->slaves[i].port_id, + mac_addr, vmdq); + if (ret < 0) + goto end; + } + + ret = 0; +end: + rte_spinlock_unlock(&internals->lock); + return ret; +} + +static void +bond_ethdev_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) +{ + struct rte_eth_dev *slave_eth_dev; + struct bond_dev_private *internals = dev->data->dev_private; + int ret, i; + + rte_spinlock_lock(&internals->lock); + + for (i = 0; i < internals->slave_count; i++) { + slave_eth_dev = &rte_eth_devices[internals->slaves[i].port_id]; + if (*slave_eth_dev->dev_ops->mac_addr_remove == NULL) + goto end; + } + + struct ether_addr *mac_addr = &dev->data->mac_addrs[index]; + + for (i = 0; i < internals->slave_count; i++) { + ret = rte_eth_dev_mac_addr_remove(internals->slaves[i].port_id, + mac_addr); + if (ret < 0) + goto end; + } + +end: + rte_spinlock_unlock(&internals->lock); +} + const struct eth_dev_ops default_dev_ops = { .dev_start = bond_ethdev_start, .dev_stop = bond_ethdev_stop, @@ -2927,6 +3037,8 @@ const struct eth_dev_ops default_dev_ops = { .rss_hash_conf_get = bond_ethdev_rss_hash_conf_get, .mtu_set = bond_ethdev_mtu_set, .mac_addr_set = bond_ethdev_mac_address_set, + .mac_addr_add = bond_ethdev_mac_addr_add, + .mac_addr_remove = bond_ethdev_mac_addr_remove, .filter_ctrl = bond_filter_ctrl }; @@ -2954,10 +3066,13 @@ bond_alloc(struct rte_vdev_device *dev, uint8_t mode) eth_dev->data->nb_rx_queues = (uint16_t)1; eth_dev->data->nb_tx_queues = (uint16_t)1; - eth_dev->data->mac_addrs = rte_zmalloc_socket(name, ETHER_ADDR_LEN, 0, - socket_id); + /* Allocate memory for storing MAC addresses */ + eth_dev->data->mac_addrs = rte_zmalloc_socket(name, ETHER_ADDR_LEN * + BOND_MAX_MAC_ADDRS, 0, socket_id); if (eth_dev->data->mac_addrs == NULL) { - RTE_BOND_LOG(ERR, "Unable to malloc mac_addrs"); + RTE_BOND_LOG(ERR, + "Failed to allocate %u bytes needed to store MAC addresses", + ETHER_ADDR_LEN * BOND_MAX_MAC_ADDRS); goto err; } diff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h index 65445b863..43e0e448d 100644 --- a/drivers/net/bonding/rte_eth_bond_private.h +++ b/drivers/net/bonding/rte_eth_bond_private.h @@ -230,6 +230,14 @@ mac_address_get(struct rte_eth_dev *eth_dev, struct ether_addr *dst_mac_addr); int mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev); +int +slave_add_mac_addresses(struct rte_eth_dev *bonded_eth_dev, + uint16_t slave_port_id); + +int +slave_remove_mac_addresses(struct rte_eth_dev *bonded_eth_dev, + uint16_t slave_port_id); + int bond_ethdev_mode_set(struct rte_eth_dev *eth_dev, int mode); -- 2.16.1.windows.1