X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbonding%2Frte_eth_bond_args.c;h=5406e1c9343c074f270d4e6d15256c2867ee2875;hb=f9f0b5121f62d8701165d20bfdd14638bc72654d;hp=3155fca4547e5621a4676c814c6583bde8089b67;hpb=dd2c630a5f8e61b9cf654a253ba30cc2cd80b5ff;p=dpdk.git diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c index 3155fca454..5406e1c934 100644 --- a/drivers/net/bonding/rte_eth_bond_args.c +++ b/drivers/net/bonding/rte_eth_bond_args.c @@ -1,44 +1,14 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation */ #include +#include +#include #include -#include -#include - #include "rte_eth_bond.h" -#include "rte_eth_bond_private.h" +#include "eth_bond_private.h" const char *pmd_bond_init_valid_arguments[] = { PMD_BOND_SLAVE_PORT_KVARG, @@ -47,37 +17,42 @@ const char *pmd_bond_init_valid_arguments[] = { PMD_BOND_XMIT_POLICY_KVARG, PMD_BOND_SOCKET_ID_KVARG, PMD_BOND_MAC_ADDR_KVARG, - "driver", + PMD_BOND_AGG_MODE_KVARG, + RTE_DEVARGS_KEY_DRIVER, NULL }; +static inline int +bond_pci_addr_cmp(const struct rte_device *dev, const void *_pci_addr) +{ + const struct rte_pci_device *pdev = RTE_DEV_TO_PCI_CONST(dev); + const struct rte_pci_addr *paddr = _pci_addr; + + return rte_pci_addr_cmp(&pdev->addr, paddr); +} + static inline int find_port_id_by_pci_addr(const struct rte_pci_addr *pci_addr) { - struct rte_pci_device *pci_dev; - struct rte_pci_addr *eth_pci_addr; + struct rte_bus *pci_bus; + struct rte_device *dev; unsigned i; - for (i = 0; i < rte_eth_dev_count(); i++) { - - /* Currently populated by rte_eth_copy_pci_info(). - * - * TODO: Once the PCI bus has arrived we should have a better - * way to test for being a PCI device or not. - */ - if (rte_eth_devices[i].data->kdrv == RTE_KDRV_UNKNOWN || - rte_eth_devices[i].data->kdrv == RTE_KDRV_NONE) - continue; + pci_bus = rte_bus_find_by_name("pci"); + if (pci_bus == NULL) { + RTE_BOND_LOG(ERR, "No PCI bus found"); + return -1; + } - pci_dev = RTE_DEV_TO_PCI(rte_eth_devices[i].device); - eth_pci_addr = &pci_dev->addr; + dev = pci_bus->find_device(NULL, bond_pci_addr_cmp, pci_addr); + if (dev == NULL) { + RTE_BOND_LOG(ERR, "unable to find PCI device"); + return -1; + } - if (pci_addr->bus == eth_pci_addr->bus && - pci_addr->devid == eth_pci_addr->devid && - pci_addr->domain == eth_pci_addr->domain && - pci_addr->function == eth_pci_addr->function) + RTE_ETH_FOREACH_DEV(i) + if (rte_eth_devices[i].device == dev) return i; - } return -1; } @@ -86,11 +61,11 @@ find_port_id_by_dev_name(const char *name) { unsigned i; - for (i = 0; i < rte_eth_dev_count(); i++) { + RTE_ETH_FOREACH_DEV(i) { if (rte_eth_devices[i].data == NULL) continue; - if (strcmp(rte_eth_devices[i].data->name, name) == 0) + if (strcmp(rte_eth_devices[i].device->name, name) == 0) return i; } return -1; @@ -107,7 +82,7 @@ parse_port_id(const char *port_str) int port_id; /* try parsing as pci address, physical devices */ - if (eal_parse_pci_DomBDF(port_str, &dev_addr) == 0) { + if (rte_pci_addr_parse(port_str, &dev_addr) == 0) { port_id = find_port_id_by_pci_addr(&dev_addr); if (port_id < 0) return -1; @@ -125,9 +100,8 @@ parse_port_id(const char *port_str) } } - if (port_id < 0 || port_id > RTE_MAX_ETHPORTS) { - RTE_BOND_LOG(ERR, "Slave port specified (%s) outside expected range", - port_str); + if (!rte_eth_dev_is_valid_port(port_id)) { + RTE_BOND_LOG(ERR, "Specified port (%s) is invalid", port_str); return -1; } return port_id; @@ -147,11 +121,12 @@ bond_ethdev_parse_slave_port_kvarg(const char *key, if (strcmp(key, PMD_BOND_SLAVE_PORT_KVARG) == 0) { int port_id = parse_port_id(value); if (port_id < 0) { - RTE_BOND_LOG(ERR, "Invalid slave port value (%s) specified", value); + RTE_BOND_LOG(ERR, "Invalid slave port value (%s) specified", + value); return -1; } else slave_ports->slaves[slave_ports->slave_count++] = - (uint8_t)port_id; + port_id; } return 0; } @@ -189,24 +164,56 @@ bond_ethdev_parse_slave_mode_kvarg(const char *key __rte_unused, } } +int +bond_ethdev_parse_slave_agg_mode_kvarg(const char *key __rte_unused, + const char *value, void *extra_args) +{ + uint8_t *agg_mode; + + if (value == NULL || extra_args == NULL) + return -1; + + agg_mode = extra_args; + + errno = 0; + if (strncmp(value, "stable", 6) == 0) + *agg_mode = AGG_STABLE; + + if (strncmp(value, "bandwidth", 9) == 0) + *agg_mode = AGG_BANDWIDTH; + + if (strncmp(value, "count", 5) == 0) + *agg_mode = AGG_COUNT; + + switch (*agg_mode) { + case AGG_STABLE: + case AGG_BANDWIDTH: + case AGG_COUNT: + return 0; + default: + RTE_BOND_LOG(ERR, "Invalid agg mode value stable/bandwidth/count"); + return -1; + } +} + int bond_ethdev_parse_socket_id_kvarg(const char *key __rte_unused, const char *value, void *extra_args) { - int socket_id; + long socket_id; char *endptr; if (value == NULL || extra_args == NULL) return -1; errno = 0; - socket_id = (uint8_t)strtol(value, &endptr, 10); + socket_id = strtol(value, &endptr, 10); if (*endptr != 0 || errno != 0) return -1; - /* validate mode value */ - if (socket_id >= 0 && socket_id < number_of_sockets()) { - *(uint8_t *)extra_args = (uint8_t)socket_id; + /* validate socket id value */ + if (socket_id >= 0 && socket_id < RTE_MAX_NUMA_NODES) { + *(int *)extra_args = (int)socket_id; return 0; } return -1; @@ -225,7 +232,7 @@ bond_ethdev_parse_primary_slave_port_id_kvarg(const char *key __rte_unused, if (primary_slave_port_id < 0) return -1; - *(uint8_t *)extra_args = (uint8_t)primary_slave_port_id; + *(uint16_t *)extra_args = (uint16_t)primary_slave_port_id; return 0; } @@ -261,8 +268,7 @@ bond_ethdev_parse_bond_mac_addr_kvarg(const char *key __rte_unused, return -1; /* Parse MAC */ - return cmdline_parse_etheraddr(NULL, value, extra_args, - sizeof(struct ether_addr)); + return rte_ether_unformat_addr(value, extra_args); } int