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 E2D59A00C5; Tue, 15 Feb 2022 13:56:27 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5235A4118A; Tue, 15 Feb 2022 13:56:08 +0100 (CET) Received: from office2.cesnet.cz (office2.cesnet.cz [195.113.144.244]) by mails.dpdk.org (Postfix) with ESMTP id 509D541158 for ; Tue, 15 Feb 2022 13:56:05 +0100 (CET) Received: from emil.fit.vutbr.cz (unknown [IPv6:2001:67c:1220:80c:eb:e00e:9e81:ff5f]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by office2.cesnet.cz (Postfix) with ESMTPSA id 26EFF40006C; Tue, 15 Feb 2022 13:56:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cesnet.cz; s=office2-2020; t=1644929765; bh=zpdMBmRXuj4Jywh7iIfg5RTkBiip4qmRc6anMhzRuJk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=MSKJs+GgegzEAbkiPi9YsuOz4uyoUg4KlvW4oIVEgRd5KqIiwb8BEdwn4iUF5AFF8 5DFtDZMttpViMom8nfuMAu6mHd07ktAiojSxWdX3KdQwa3waRB8zUbYojq5dqXFxZQ GNSPvcbDJ9k5nQJrx4wPW/sFVAkrxqH5sCjOL+w1oStU0Sik84bSdBCddwiWSiiaOK anmfvG0OLwlvXhKlhliK6xmNfTSZ4cHv3PoL4f6ZR5Vt/iGfJih8PnRBB0DXSJ+hjN IU/5oBZkeaRSJHz7Ibwmli0koodOoWI89Q3uzN2DZoo4Sr+GjiDCH1OUVDE9+lxV5q PzZVK1j01DxiA== From: spinler@cesnet.cz To: dev@dpdk.org Cc: Martin Spinler Subject: [PATCH v2 5/5] net/nfb: add support for more MAC addresses Date: Tue, 15 Feb 2022 13:55:43 +0100 Message-Id: <20220215125543.142108-6-spinler@cesnet.cz> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220215125543.142108-1-spinler@cesnet.cz> References: <20220214112541.29782-1-spinler@cesnet.cz> <20220215125543.142108-1-spinler@cesnet.cz> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 From: Martin Spinler Extend the eth_dev_ops by add/remove MAC address functions. Signed-off-by: Martin Spinler --- drivers/net/nfb/nfb_ethdev.c | 90 ++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/drivers/net/nfb/nfb_ethdev.c b/drivers/net/nfb/nfb_ethdev.c index 5d503e131a..defd118bd0 100644 --- a/drivers/net/nfb/nfb_ethdev.c +++ b/drivers/net/nfb/nfb_ethdev.c @@ -202,6 +202,30 @@ nfb_eth_dev_configure(struct rte_eth_dev *dev __rte_unused) return 0; } +static uint32_t +nfb_eth_get_max_mac_address_count(struct rte_eth_dev *dev) +{ + uint16_t i; + uint32_t c; + uint32_t ret = (uint32_t)-1; + struct pmd_internals *internals = dev->data->dev_private; + + /* + * Go through all RX MAC components in firmware and find + * the minimal indicated space size for MAC addresses. + */ + for (i = 0; i < internals->max_rxmac; i++) { + c = nc_rxmac_mac_address_count(internals->rxmac[i]); + ret = RTE_MIN(c, ret); + } + + /* The driver must support at least 1 MAC address, pretend that */ + if (internals->max_rxmac == 0 || ret == 0) + ret = 1; + + return ret; +} + /** * DPDK callback to get information about the device. * @@ -214,7 +238,8 @@ static int nfb_eth_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) { - dev_info->max_mac_addrs = 1; + dev_info->max_mac_addrs = nfb_eth_get_max_mac_address_count(dev); + dev_info->max_rx_pktlen = (uint32_t)-1; dev_info->max_rx_queues = dev->data->nb_rx_queues; dev_info->max_tx_queues = dev->data->nb_tx_queues; @@ -376,6 +401,18 @@ nfb_eth_dev_set_link_down(struct rte_eth_dev *dev) return 0; } +static uint64_t +nfb_eth_mac_addr_conv(struct rte_ether_addr *mac_addr) +{ + int i; + uint64_t res = 0; + for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) { + res <<= 8; + res |= mac_addr->addr_bytes[i] & 0xFF; + } + return res; +} + /** * DPDK callback to set primary MAC address. * @@ -392,26 +429,48 @@ nfb_eth_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) { unsigned int i; - uint64_t mac = 0; + uint64_t mac; struct rte_eth_dev_data *data = dev->data; struct pmd_internals *internals = (struct pmd_internals *) data->dev_private; - if (!rte_is_valid_assigned_ether_addr(mac_addr)) - return -EINVAL; + mac = nfb_eth_mac_addr_conv(mac_addr); + /* Until no real multi-port support, configure all RX MACs the same */ + for (i = 0; i < internals->max_rxmac; ++i) + nc_rxmac_set_mac(internals->rxmac[i], 0, mac, 1); - for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) { - mac <<= 8; - mac |= mac_addr->addr_bytes[i] & 0xFF; - } + return 0; +} +static int +nfb_eth_mac_addr_add(struct rte_eth_dev *dev, + struct rte_ether_addr *mac_addr, uint32_t index, uint32_t pool __rte_unused) +{ + unsigned int i; + uint64_t mac; + struct rte_eth_dev_data *data = dev->data; + struct pmd_internals *internals = (struct pmd_internals *) + data->dev_private; + + mac = nfb_eth_mac_addr_conv(mac_addr); for (i = 0; i < internals->max_rxmac; ++i) - nc_rxmac_set_mac(internals->rxmac[i], 0, mac, 1); + nc_rxmac_set_mac(internals->rxmac[i], index, mac, 1); - rte_ether_addr_copy(mac_addr, data->mac_addrs); return 0; } +static void +nfb_eth_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) +{ + unsigned int i; + struct rte_eth_dev_data *data = dev->data; + struct pmd_internals *internals = (struct pmd_internals *) + data->dev_private; + + for (i = 0; i < internals->max_rxmac; ++i) + nc_rxmac_set_mac(internals->rxmac[i], index, 0, 0); +} + static const struct eth_dev_ops ops = { .dev_start = nfb_eth_dev_start, .dev_stop = nfb_eth_dev_stop, @@ -436,6 +495,8 @@ static const struct eth_dev_ops ops = { .stats_get = nfb_eth_stats_get, .stats_reset = nfb_eth_stats_reset, .mac_addr_set = nfb_eth_mac_addr_set, + .mac_addr_add = nfb_eth_mac_addr_add, + .mac_addr_remove = nfb_eth_mac_addr_remove, }; /** @@ -450,6 +511,7 @@ static const struct eth_dev_ops ops = { static int nfb_eth_dev_init(struct rte_eth_dev *dev) { + uint32_t mac_count; struct rte_eth_dev_data *data = dev->data; struct pmd_internals *internals = (struct pmd_internals *) data->dev_private; @@ -516,9 +578,10 @@ nfb_eth_dev_init(struct rte_eth_dev *dev) /* Get link state */ nfb_eth_link_update(dev, 0); - /* Allocate space for one mac address */ - data->mac_addrs = rte_zmalloc(data->name, sizeof(struct rte_ether_addr), - RTE_CACHE_LINE_SIZE); + /* Allocate space for MAC addresses */ + mac_count = nfb_eth_get_max_mac_address_count(dev); + data->mac_addrs = rte_zmalloc(data->name, + sizeof(struct rte_ether_addr) * mac_count, RTE_CACHE_LINE_SIZE); if (data->mac_addrs == NULL) { RTE_LOG(ERR, PMD, "Could not alloc space for MAC address!\n"); nfb_close(internals->nfb); @@ -531,6 +594,7 @@ nfb_eth_dev_init(struct rte_eth_dev *dev) eth_addr_init.addr_bytes[2] = eth_addr.addr_bytes[2]; nfb_eth_mac_addr_set(dev, ð_addr_init); + rte_ether_addr_copy(ð_addr_init, &dev->data->mac_addrs[0]); data->promiscuous = nfb_eth_promiscuous_get(dev); data->all_multicast = nfb_eth_allmulticast_get(dev); -- 2.35.1