X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fring%2Frte_eth_ring.c;h=db10f035dfcb65407b222f68d8223860821c8093;hb=586e6028371764452b7dbae3b1f50adde87be80e;hp=ed0fdeb28ff0d63fc1e23235d75607e3ae1d561e;hpb=c4c2bc7e2e49ffe1169b22b537c495354e2c71ea;p=dpdk.git diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index ed0fdeb28f..db10f035df 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, @@ -55,13 +56,13 @@ struct pmd_internals { }; static struct rte_eth_link pmd_link = { - .link_speed = ETH_SPEED_NUM_10G, - .link_duplex = ETH_LINK_FULL_DUPLEX, - .link_status = ETH_LINK_DOWN, - .link_autoneg = ETH_LINK_FIXED, + .link_speed = RTE_ETH_SPEED_NUM_10G, + .link_duplex = RTE_ETH_LINK_FULL_DUPLEX, + .link_status = RTE_ETH_LINK_DOWN, + .link_autoneg = RTE_ETH_LINK_FIXED, }; -RTE_LOG_REGISTER(eth_ring_logtype, pmd.net.ring, NOTICE); +RTE_LOG_REGISTER_DEFAULT(eth_ring_logtype, NOTICE); #define PMD_LOG(level, fmt, args...) \ rte_log(RTE_LOG_ ## level, eth_ring_logtype, \ @@ -101,27 +102,29 @@ eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { return 0; } static int eth_dev_start(struct rte_eth_dev *dev) { - dev->data->dev_link.link_status = ETH_LINK_UP; + dev->data->dev_link.link_status = RTE_ETH_LINK_UP; return 0; } -static void +static int eth_dev_stop(struct rte_eth_dev *dev) { - dev->data->dev_link.link_status = ETH_LINK_DOWN; + dev->data->dev_started = 0; + dev->data->dev_link.link_status = RTE_ETH_LINK_DOWN; + return 0; } static int eth_dev_set_link_down(struct rte_eth_dev *dev) { - dev->data->dev_link.link_status = ETH_LINK_DOWN; + dev->data->dev_link.link_status = RTE_ETH_LINK_DOWN; return 0; } static int eth_dev_set_link_up(struct rte_eth_dev *dev) { - dev->data->dev_link.link_status = ETH_LINK_UP; + dev->data->dev_link.link_status = RTE_ETH_LINK_UP; return 0; } @@ -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 = RTE_ETH_RX_OFFLOAD_SCATTER; + dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS; dev_info->max_tx_queues = (uint16_t)internals->max_tx_queues; dev_info->min_rx_bufsize = 0; @@ -220,8 +225,6 @@ eth_mac_addr_add(struct rte_eth_dev *dev __rte_unused, return 0; } -static void -eth_queue_release(void *q __rte_unused) { ; } static int eth_link_update(struct rte_eth_dev *dev __rte_unused, int wait_to_complete __rte_unused) { return 0; } @@ -232,11 +235,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 +257,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 = { @@ -266,8 +270,6 @@ static const struct eth_dev_ops ops = { .dev_infos_get = eth_dev_info, .rx_queue_setup = eth_rx_queue_setup, .tx_queue_setup = eth_tx_queue_setup, - .rx_queue_release = eth_queue_release, - .tx_queue_release = eth_queue_release, .link_update = eth_link_update, .stats_get = eth_stats_get, .stats_reset = eth_stats_reset, @@ -355,10 +357,10 @@ 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; - data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE; /* finally assign rx and tx ops */ eth_dev->rx_pkt_burst = eth_ring_rx; @@ -570,8 +572,21 @@ parse_internal_args(const char *key __rte_unused, const char *value, { struct ring_internal_args **internal_args = data; void *args; + int ret, n; - sscanf(value, "%p", &args); + /* 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"); + + return -1; + } *internal_args = args; @@ -596,6 +611,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); @@ -610,7 +642,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) {