@@ -820,3 +820,8 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
# Compile the eventdev application
#
CONFIG_RTE_APP_EVENTDEV=y
+
+#
+# Compile representor PMD
+#
+CONFIG_RTE_LIBRTE_REPRESENTOR=y
@@ -101,6 +101,9 @@ DEPDIRS-librte_distributor := librte_eal librte_mbuf librte_ether
DIRS-$(CONFIG_RTE_LIBRTE_PORT) += librte_port
DEPDIRS-librte_port := librte_eal librte_mempool librte_mbuf librte_ether
DEPDIRS-librte_port += librte_ip_frag librte_sched
+DIRS-$(CONFIG_RTE_LIBRTE_REPRESENTOR) += librte_representor
+DEPDIRS-librte_representor += librte_ether
+
ifeq ($(CONFIG_RTE_LIBRTE_KNI),y)
DEPDIRS-librte_port += librte_kni
endif
new file mode 100644
@@ -0,0 +1,53 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2017 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.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_representor.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+EXPORT_MAP := rte_port_representor_version.map
+
+LIBABIVER := 1
+
+SRCS-$(CONFIG_RTE_LIBRTE_REPRESENTOR) += rte_port_representor.c
+
+#
+# Export include files
+#
+SYMLINK-$(CONFIG_RTE_LIBRTE_REPRESENTOR)-include += rte_port_representor_driver.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
new file mode 100644
@@ -0,0 +1,212 @@
+/*-
+ * BSD LICENSE
+ *
+ * Copyright(c) 2017 Intel Corporation. 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.
+ */
+
+#include "rte_port_representor_driver.h"
+
+TAILQ_HEAD(rte_broker_list, rte_representor_broker);
+
+struct rte_broker_list broker_list =
+ TAILQ_HEAD_INITIALIZER(broker_list);
+
+/* Macros to check for valid id */
+#define RTE_VERIFY_OR_ERR_RET(val, retval) do { \
+ if (!(val)) { \
+ RTE_PMD_DEBUG_TRACE("verify failed, ret= %d", (retval)); \
+ return retval; \
+ } \
+} while (0)
+
+#define RTE_VERIFY_OR_RET(val) do { \
+ if (!(val)) { \
+ RTE_PMD_DEBUG_TRACE("verify failed"); \
+ return; \
+ } \
+} while (0)
+
+int
+rte_representor_broker_init(struct rte_representor_broker *broker)
+{
+ RTE_VERIFY_OR_ERR_RET(broker, -ENODEV);
+
+ RTE_VERIFY_OR_ERR_RET(broker->bus && strlen(broker->bus), -ENXIO);
+ RTE_VERIFY_OR_ERR_RET(broker->device && strlen(broker->device), -ENXIO);
+
+ RTE_VERIFY_OR_ERR_RET(broker->nb_virtual_ports > 0, -EINVAL);
+
+ broker->vports = rte_malloc("rte_representor_ports",
+ sizeof(*(broker->vports)) * broker->nb_virtual_ports, 0);
+ if (broker->vports == NULL)
+ return -ENOMEM;
+
+ RTE_VERIFY_OR_ERR_RET(broker->ops, -EINVAL);
+
+ TAILQ_INSERT_TAIL(&broker_list, broker, next);
+ RTE_LOG(INFO, EAL, "Registered [%s_%s] broker.\n", broker->bus,
+ broker->device);
+
+ return 0;
+}
+
+int
+rte_representor_broker_uninit(struct rte_representor_broker *broker)
+{
+ int i;
+ struct rte_eth_dev *ethdev;
+ char name[RTE_DEV_NAME_MAX_LEN];
+
+ for (i = 0; i < broker->nb_virtual_ports; i++) {
+ if (broker->vports[i].state == RTE_REPRESENTOR_PORT_VALID) {
+ ethdev = broker->vports[i].ethdev;
+ rte_eth_dev_detach(ethdev->data->port_id,
+ name);
+ }
+ }
+
+ rte_free(broker->vports);
+
+ TAILQ_REMOVE(&broker_list, broker, next);
+ RTE_LOG(DEBUG, EAL, "Unregistered [%s_%s] broker.\n", broker->bus,
+ broker->device);
+
+ return 0;
+}
+
+struct rte_representor_broker *
+rte_representor_broker_find(const char *bus, const char *device)
+{
+ struct rte_representor_broker *broker = NULL;
+
+ TAILQ_FOREACH(broker, &broker_list, next) {
+ if ((strcmp(broker->bus, bus) == 0) &&
+ (strcmp(broker->device, device) == 0))
+ break;
+ }
+
+ return broker;
+}
+
+#define RTE_REPRESENTOR_PORT_VALID_ETHDEV_OR_RET_ERR(ethdev, retval) do { \
+ if (!(ethdev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR_PORT)) { \
+ RTE_PMD_DEBUG_TRACE("port %d is not a representor port", \
+ ethdev->data.port_id); \
+ return retval; \
+ } \
+} while (0)
+
+#define RTE_REPRESENTOR_PORT_VALID_OR_RET_ERR(vport, retval) do { \
+ if (!(vport->state == RTE_REPRESENTOR_PORT_VALID)) { \
+ RTE_PMD_DEBUG_TRACE("port %d is not a representor port", \
+ ethdev->data.port_id); \
+ return retval; \
+ } \
+} while (0)
+
+static struct rte_representor_port *
+representor_port_find(struct rte_representor_broker *broker,
+ uint16_t vport_id)
+{
+ if (vport_id >= broker->nb_virtual_ports)
+ return NULL;
+
+ return &broker->vports[vport_id];
+}
+
+int
+rte_representor_port_register(struct rte_representor_broker *broker,
+ uint32_t vport_id, struct rte_eth_dev *ethdev)
+{
+ struct rte_representor_port *port;
+
+ int retval = 0;
+
+ RTE_REPRESENTOR_PORT_VALID_ETHDEV_OR_RET_ERR(ethdev, -EINVAL);
+
+ port = representor_port_find(broker, vport_id);
+ if (port == NULL)
+ return -EINVAL;
+
+ if (port->state == RTE_REPRESENTOR_PORT_VALID)
+ return -EEXIST;
+
+ port->vport_id = vport_id;
+ port->ethdev = ethdev;
+ port->broker = broker;
+ port->state = RTE_REPRESENTOR_PORT_VALID;
+
+ /**
+ * Set representor port ethdev's private data context as allocate
+ * representor.
+ */
+ ethdev->data->dev_private = port;
+
+ RTE_FUNC_PTR_OR_ERR_RET(broker->ops->port_init, -ENOTSUP);
+ retval = broker->ops->port_init(broker, ethdev);
+ if (retval)
+ return retval;
+
+ RTE_LOG(INFO, EAL, "Registered port representor "
+ "<broker=%s_%s, vport_id=%u>\n",
+ broker->bus, broker->device, vport_id);
+
+ return 0;
+}
+
+int
+rte_representor_port_unregister(struct rte_eth_dev *ethdev)
+{
+ struct rte_representor_port *port;
+
+ RTE_REPRESENTOR_PORT_VALID_ETHDEV_OR_RET_ERR(ethdev, -EINVAL);
+
+ port = (struct rte_representor_port *)ethdev->data->dev_private;
+ RTE_REPRESENTOR_PORT_VALID_OR_RET_ERR(port, -ENODEV);
+
+
+ RTE_FUNC_PTR_OR_ERR_RET(port->broker->ops->port_uninit, -ENOTSUP);
+ port->broker->ops->port_uninit(port->broker, ethdev);
+
+ port->state = RTE_REPRESENTOR_PORT_INVALID;
+
+ return 0;
+}
+
+int
+rte_representor_port_get_vport_id(struct rte_eth_dev *ethdev)
+{
+ struct rte_representor_port *port;
+
+ RTE_REPRESENTOR_PORT_VALID_ETHDEV_OR_RET_ERR(ethdev, -EINVAL);
+
+ port = (struct rte_representor_port *)ethdev->data->dev_private;
+
+ return port->vport_id;
+}
new file mode 100644
@@ -0,0 +1,183 @@
+/*-
+ * BSD LICENSE
+ *
+ * Copyright(c) 2017 Intel Corporation. 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.
+ */
+
+#ifndef _RTE_PORT_REPRESENTOR_DRIVER_H_
+#define _RTE_PORT_REPRESENTOR_DRIVER_H_
+
+/**
+ * @file
+ * RTE Port Representor Driver API
+ *
+ * Driver APIs for management and support of port representor
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rte_ethdev.h>
+#include <rte_malloc.h>
+#include <rte_flow.h>
+
+struct rte_representor_port;
+
+struct rte_representor_broker {
+ TAILQ_ENTRY(rte_representor_broker) next;
+ /**< Next broker object in linked list */
+
+ const char *bus; /**< bus name */
+ const char *device; /**< device name */
+
+ uint16_t nb_virtual_ports;
+ /**< number of virtual ports supported by device */
+
+ struct rte_representor_port *vports;
+ /**< Representor port contexts */
+
+ struct rte_representor_broker_port_ops *ops;
+ /**< broker port operations functions */
+ void *private_data;
+ /**< broker private data */
+};
+
+
+/** Port Representor */
+struct rte_representor_port {
+ uint16_t vport_id;
+ /**< Virtual Port Identifier */
+ struct rte_eth_dev *ethdev;
+ /**< ethdev handle of representor port */
+ struct rte_representor_broker *broker;
+ /**< Broker handle to allow reverse lookup */
+ enum {
+ RTE_REPRESENTOR_PORT_INVALID,
+ /**< No ethdev instantiated for virtual port */
+ RTE_REPRESENTOR_PORT_VALID
+ /**< ethdev active for virtual port */
+ } state;
+ /**< port state */
+ void *priv_data;
+ /**< port private data */
+};
+
+typedef int (*representor_broker_port_init_t)(
+ struct rte_representor_broker *broker,
+ struct rte_eth_dev *ethdev);
+
+typedef int (*representor_broker_port_uninit_t)(
+ struct rte_representor_broker *broker,
+ struct rte_eth_dev *ethdev);
+
+struct rte_representor_broker_port_ops {
+ representor_broker_port_init_t port_init;
+ representor_broker_port_init_t port_uninit;
+};
+
+/**
+ * Initialize port representor broker
+ *
+ * This function is called by the PMDs initialization routine if the port
+ * representor is enabled by EAL command line argument.
+ *
+ * Verifies broker context parameters and initialises required resources.
+ *
+ * @param broker port representor broker context
+
+ * @return
+ * - 0 on success
+ * - errno on failure
+ */
+int
+rte_representor_broker_init(struct rte_representor_broker *broker);
+
+
+/**
+ * Un-initialize the port representor broker freeing all associated resources.
+ *
+ * @param broker port representor broker
+ *
+ * @return
+ * - 0 on success
+ * - errno on failure
+ */
+int
+rte_representor_broker_uninit(struct rte_representor_broker *broker);
+
+struct rte_representor_broker *
+rte_representor_broker_find(const char *bus, const char *device);
+
+/**
+ * Registers a representor ethdev with the broker, allocating a port representor
+ * context and calling the representor port initialization function.
+ *
+ * @param broker Port representor broker to register with
+ * @param vport_id Virtual port ID to register ethdev against
+ * @param ethdev Port representor ethdev handle
+ *
+ * @return
+ * - 0 on successful registration and initialization of representor port
+ * - errno on failure
+ */
+int
+rte_representor_port_register(struct rte_representor_broker *broker,
+ uint32_t vport_id, struct rte_eth_dev *ethdev);
+
+/**
+ * Unregister a representor port, called during destruction of representor
+ * ethdev context. Freeing any allocated memory for the representor port.
+ *
+ * @param ethdev Port representor ethdev handle
+ *
+ * @return
+ * - 0 on success
+ * - errno on failure
+ */
+int
+rte_representor_port_unregister(struct rte_eth_dev *ethdev);
+
+/**
+ * Get the virtual port ID of given representor port ethdev context
+ *
+ * @param ethdev Port representor ethdev handle
+ *
+ * @return
+ * - Virtual port ID
+ * - errno on failure
+ */
+int
+rte_representor_port_get_vport_id(struct rte_eth_dev *ethdev);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_PORT_REPRESENTOR_DRIVER_H_ */
new file mode 100644
@@ -0,0 +1,12 @@
+DPDK_18.02 {2 {
+ global:
+
+ rte_representor_broker_find;
+ rte_representor_broker_init;
+ rte_representor_broker_uninit;
+ rte_representor_port_get_vport_id;
+ rte_representor_port_register;
+ rte_representor_port_unregister;
+
+ local: *;
+};
@@ -104,6 +104,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL) += -lrte_eal
_LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE) += -lrte_cmdline
_LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER) += -lrte_reorder
_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrte_sched
+_LDLIBS-$(CONFIG_RTE_LIBRTE_REPRESENTOR) += -lrte_representor
ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y)
_LDLIBS-$(CONFIG_RTE_LIBRTE_KNI) += -lrte_kni