X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fring%2Frte_eth_ring.c;h=02f6da2817ba4407005599eee0ca221c92488b6d;hb=31d7c6f7d424c533b0a4dd9b4408b814ac7852f1;hp=12046f5a000c077bf207876d6c68aa8f9ca02777;hpb=fbd1913561484b58e155fbefea4e15491ed60c9f;p=dpdk.git diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 12046f5a00..02f6da2817 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -4,7 +4,7 @@ #include "rte_eth_ring.h" #include -#include +#include #include #include #include @@ -16,6 +16,7 @@ #define ETH_RING_ACTION_CREATE "CREATE" #define ETH_RING_ACTION_ATTACH "ATTACH" #define ETH_RING_INTERNAL_ARG "internal" +#define ETH_RING_INTERNAL_ARG_MAX_LEN 19 /* "0x..16chars..\0" */ static const char *valid_arguments[] = { ETH_RING_NUMA_NODE_ACTION_ARG, @@ -105,10 +106,12 @@ eth_dev_start(struct rte_eth_dev *dev) return 0; } -static void +static int eth_dev_stop(struct rte_eth_dev *dev) { + dev->data->dev_started = 0; dev->data->dev_link.link_status = ETH_LINK_DOWN; + return 0; } static int @@ -160,6 +163,8 @@ eth_dev_info(struct rte_eth_dev *dev, dev_info->max_mac_addrs = 1; dev_info->max_rx_pktlen = (uint32_t)-1; dev_info->max_rx_queues = (uint16_t)internals->max_rx_queues; + dev_info->rx_offload_capa = DEV_RX_OFFLOAD_SCATTER; + dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS; dev_info->max_tx_queues = (uint16_t)internals->max_tx_queues; dev_info->min_rx_bufsize = 0; @@ -232,11 +237,12 @@ eth_dev_close(struct rte_eth_dev *dev) struct pmd_internals *internals = NULL; struct ring_queue *r = NULL; uint16_t i; + int ret; if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - eth_dev_stop(dev); + ret = eth_dev_stop(dev); internals = dev->data->dev_private; if (internals->action == DEV_CREATE) { @@ -253,7 +259,7 @@ eth_dev_close(struct rte_eth_dev *dev) /* mac_addrs must not be freed alone because part of dev_private */ dev->data->mac_addrs = NULL; - return 0; + return ret; } static const struct eth_dev_ops ops = { @@ -355,6 +361,7 @@ do_eth_dev_ring_create(const char *name, data->mac_addrs = &internals->address; data->promiscuous = 1; data->all_multicast = 1; + data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; eth_dev->dev_ops = &ops; data->numa_node = numa_node; @@ -569,8 +576,21 @@ parse_internal_args(const char *key __rte_unused, const char *value, { struct ring_internal_args **internal_args = data; void *args; + int ret, n; + + /* make sure 'value' is valid pointer length */ + if (strnlen(value, ETH_RING_INTERNAL_ARG_MAX_LEN) >= + ETH_RING_INTERNAL_ARG_MAX_LEN) { + PMD_LOG(ERR, "Error parsing internal args, argument is too long"); + return -1; + } + + ret = sscanf(value, "%p%n", &args, &n); + if (ret == 0 || (size_t)n != strlen(value)) { + PMD_LOG(ERR, "Error parsing internal args"); - sscanf(value, "%p", &args); + return -1; + } *internal_args = args; @@ -595,6 +615,23 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) PMD_LOG(INFO, "Initializing pmd_ring for %s", name); + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + eth_dev = rte_eth_dev_attach_secondary(name); + if (!eth_dev) { + PMD_LOG(ERR, "Failed to probe %s", name); + return -1; + } + eth_dev->dev_ops = &ops; + eth_dev->device = &dev->device; + + eth_dev->rx_pkt_burst = eth_ring_rx; + eth_dev->tx_pkt_burst = eth_ring_tx; + + rte_eth_dev_probing_finish(eth_dev); + + return 0; + } + if (params == NULL || params[0] == '\0') { ret = eth_dev_ring_create(name, dev, rte_socket_id(), DEV_CREATE, ð_dev); @@ -609,7 +646,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) if (!kvlist) { PMD_LOG(INFO, - "Ignoring unsupported parameters when creatingrings-backed ethernet device"); + "Ignoring unsupported parameters when creating rings-backed ethernet device"); ret = eth_dev_ring_create(name, dev, rte_socket_id(), DEV_CREATE, ð_dev); if (ret == -1) {