X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fnetmap_compat%2Flib%2Fcompat_netmap.c;h=0be0663ede08c8b480a9a2f1f8caf2b5a08fde56;hb=09037cf36c0888b6310d0e56739954e7bf691f97;hp=d9b40513d4dbc9c17b898a9e901689d6bb3c740b;hpb=98a7ea332ba3da0f74ec951595d36a616165b255;p=dpdk.git diff --git a/examples/netmap_compat/lib/compat_netmap.c b/examples/netmap_compat/lib/compat_netmap.c index d9b40513d4..0be0663ede 100644 --- a/examples/netmap_compat/lib/compat_netmap.c +++ b/examples/netmap_compat/lib/compat_netmap.c @@ -1,34 +1,5 @@ -/*- - * 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 @@ -47,7 +18,6 @@ #include #include #include -#include #include #include @@ -129,7 +99,7 @@ static void netmap_unregif(uint32_t idx, uint32_t port); static int32_t -ifname_to_portid(const char *ifname, uint8_t *port) +ifname_to_portid(const char *ifname, uint16_t *port) { char *endptr; uint64_t portid; @@ -140,7 +110,7 @@ ifname_to_portid(const char *ifname, uint8_t *port) portid >= RTE_DIM(ports) || errno != 0) return -EINVAL; - *port = (uint8_t)portid; + *port = portid; return 0; } @@ -222,10 +192,10 @@ fd_release(int32_t fd) } static int -check_nmreq(struct nmreq *req, uint8_t *port) +check_nmreq(struct nmreq *req, uint16_t *port) { int32_t rc; - uint8_t portid; + uint16_t portid; if (req == NULL) return -EINVAL; @@ -242,7 +212,7 @@ check_nmreq(struct nmreq *req, uint8_t *port) } if (ports[portid].pool == NULL) { - RTE_LOG(ERR, USER1, "Misconfigured portid %hhu\n", portid); + RTE_LOG(ERR, USER1, "Misconfigured portid %u\n", portid); return -EINVAL; } @@ -262,7 +232,7 @@ check_nmreq(struct nmreq *req, uint8_t *port) static int ioctl_niocginfo(__rte_unused int fd, void * param) { - uint8_t portid; + uint16_t portid; struct nmreq *req; int32_t rc; @@ -283,7 +253,7 @@ ioctl_niocginfo(__rte_unused int fd, void * param) } static void -netmap_ring_setup(struct netmap_ring *ring, uint8_t port, uint32_t ringid, +netmap_ring_setup(struct netmap_ring *ring, uint16_t port, uint32_t ringid, uint32_t num_slots) { uint32_t j; @@ -305,7 +275,7 @@ netmap_ring_setup(struct netmap_ring *ring, uint8_t port, uint32_t ringid, } static int -netmap_regif(struct nmreq *req, uint32_t idx, uint8_t port) +netmap_regif(struct nmreq *req, uint32_t idx, uint16_t port) { struct netmap_if *nmif; struct netmap_ring *ring; @@ -313,7 +283,7 @@ netmap_regif(struct nmreq *req, uint32_t idx, uint8_t port) int32_t rc; if (ports[port].fd < RTE_DIM(fd_port)) { - RTE_LOG(ERR, USER1, "port %hhu already in use by fd: %u\n", + RTE_LOG(ERR, USER1, "port %u already in use by fd: %u\n", port, IDX_TO_FD(ports[port].fd)); return -EBUSY; } @@ -399,7 +369,7 @@ netmap_regif(struct nmreq *req, uint32_t idx, uint8_t port) static int ioctl_niocregif(int32_t fd, void * param) { - uint8_t portid; + uint16_t portid; int32_t rc; uint32_t idx; struct nmreq *req; @@ -422,7 +392,7 @@ netmap_unregif(uint32_t idx, uint32_t port) { fd_port[idx].port = FD_PORT_RSRV; ports[port].fd = UINT32_MAX; - rte_eth_dev_stop((uint8_t)port); + rte_eth_dev_stop(port); } /** @@ -460,7 +430,7 @@ ioctl_niocunregif(int fd) * packets as it can hold coming from its dpdk port. */ static inline int -rx_sync_ring(struct netmap_ring *ring, uint8_t port, uint16_t ring_number, +rx_sync_ring(struct netmap_ring *ring, uint16_t port, uint16_t ring_number, uint16_t max_burst) { int32_t i, n_rx; @@ -513,7 +483,7 @@ rx_sync_if(uint32_t port) for (i = 0; i < nifp->ni_rx_rings + 1; i++) { r = NETMAP_RXRING(nifp, i); - rx_sync_ring(r, (uint8_t)port, (uint16_t)i, burst); + rx_sync_ring(r, port, (uint16_t)i, burst); rc += r->avail; } @@ -542,7 +512,7 @@ ioctl_niocrxsync(int fd) * buffers into rte_mbufs and sending them out on the rings's dpdk port. */ static int -tx_sync_ring(struct netmap_ring *ring, uint8_t port, uint16_t ring_number, +tx_sync_ring(struct netmap_ring *ring, uint16_t port, uint16_t ring_number, struct rte_mempool *pool, uint16_t max_burst) { uint32_t i, n_tx; @@ -608,7 +578,7 @@ tx_sync_if(uint32_t port) for (i = 0; i < nifp->ni_tx_rings + 1; i++) { r = NETMAP_TXRING(nifp, i); - tx_sync_ring(r, (uint8_t)port, (uint16_t)i, mp, burst); + tx_sync_ring(r, port, (uint16_t)i, mp, burst); rc += r->avail; } @@ -686,58 +656,76 @@ rte_netmap_init(const struct rte_netmap_conf *conf) int -rte_netmap_init_port(uint8_t portid, const struct rte_netmap_port_conf *conf) +rte_netmap_init_port(uint16_t portid, const struct rte_netmap_port_conf *conf) { int32_t ret; uint16_t i; uint16_t rx_slots, tx_slots; + struct rte_eth_rxconf rxq_conf; + struct rte_eth_txconf txq_conf; + struct rte_eth_dev_info dev_info; if (conf == NULL || portid >= RTE_DIM(ports) || conf->nr_tx_rings > netmap.conf.max_rings || conf->nr_rx_rings > netmap.conf.max_rings) { - RTE_LOG(ERR, USER1, "%s(%hhu): invalid parameters\n", + RTE_LOG(ERR, USER1, "%s(%u): invalid parameters\n", __func__, portid); return -EINVAL; } - rx_slots = (uint16_t)rte_align32pow2(conf->nr_rx_slots); - tx_slots = (uint16_t)rte_align32pow2(conf->nr_tx_slots); + rx_slots = (uint16_t)rte_align32pow2(conf->nr_rx_slots); + tx_slots = (uint16_t)rte_align32pow2(conf->nr_tx_slots); if (tx_slots > netmap.conf.max_slots || rx_slots > netmap.conf.max_slots) { - RTE_LOG(ERR, USER1, "%s(%hhu): invalid parameters\n", + RTE_LOG(ERR, USER1, "%s(%u): invalid parameters\n", __func__, portid); return -EINVAL; } + rte_eth_dev_info_get(portid, &dev_info); + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) + conf->eth_conf->txmode.offloads |= + DEV_TX_OFFLOAD_MBUF_FAST_FREE; ret = rte_eth_dev_configure(portid, conf->nr_rx_rings, conf->nr_tx_rings, conf->eth_conf); if (ret < 0) { - RTE_LOG(ERR, USER1, "Couldn't configure port %hhu\n", portid); - return ret; + RTE_LOG(ERR, USER1, "Couldn't configure port %u\n", portid); + return ret; + } + + ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &rx_slots, &tx_slots); + + if (ret < 0) { + RTE_LOG(ERR, USER1, + "Couldn't ot adjust number of descriptors for port %u\n", + portid); + return ret; } + rxq_conf = dev_info.default_rxconf; + rxq_conf.offloads = conf->eth_conf->rxmode.offloads; + txq_conf = dev_info.default_txconf; + txq_conf.offloads = conf->eth_conf->txmode.offloads; for (i = 0; i < conf->nr_tx_rings; i++) { ret = rte_eth_tx_queue_setup(portid, i, tx_slots, - conf->socket_id, NULL); + conf->socket_id, &txq_conf); if (ret < 0) { RTE_LOG(ERR, USER1, - "Couldn't configure TX queue %"PRIu16" of " - "port %"PRIu8"\n", + "fail to configure TX queue %u of port %u\n", i, portid); return ret; } ret = rte_eth_rx_queue_setup(portid, i, rx_slots, - conf->socket_id, NULL, conf->pool); + conf->socket_id, &rxq_conf, conf->pool); if (ret < 0) { RTE_LOG(ERR, USER1, - "Couldn't configure RX queue %"PRIu16" of " - "port %"PRIu8"\n", + "fail to configure RX queue %u of port %u\n", i, portid); return ret; }