@@ -15,6 +15,7 @@
*/
#include <config.h>
+#include <errno.h>
#include "dpif-offload.h"
#include "dpif-offload-provider.h"
@@ -34,6 +35,7 @@ static unsigned int offload_thread_nb = DEFAULT_OFFLOAD_THREAD_NB;
/* dpif offload interface for the dpdk rte_flow implementation. */
struct dpif_offload_dpdk {
struct dpif_offload offload;
+ struct dpif_offload_port_mgr *port_mgr;
/* Configuration specific variables. */
struct ovsthread_once once_enable; /* Track first-time enablement. */
@@ -46,6 +48,59 @@ dpif_offload_dpdk_cast(const struct dpif_offload *offload)
return CONTAINER_OF(offload, struct dpif_offload_dpdk, offload);
}
+static int
+dpif_offload_dpdk_enable_offload(struct dpif_offload *offload_,
+ struct dpif_offload_port_mgr_port *port)
+{
+ dpif_offload_set_netdev_offload(port->netdev, offload_);
+ return 0;
+}
+
+static int
+dpif_offload_dpdk_cleanup_offload(struct dpif_offload *offload_ OVS_UNUSED,
+ struct dpif_offload_port_mgr_port *port)
+{
+ dpif_offload_set_netdev_offload(port->netdev, NULL);
+ return 0;
+}
+
+static int
+dpif_offload_dpdk_port_add(struct dpif_offload *offload_,
+ struct netdev *netdev, odp_port_t port_no)
+{
+ struct dpif_offload_dpdk *offload = dpif_offload_dpdk_cast(offload_);
+ struct dpif_offload_port_mgr_port *port = xmalloc(sizeof *port);
+
+ if (dpif_offload_port_mgr_add(offload->port_mgr, port, netdev,
+ port_no, false)) {
+ if (dpif_offload_is_offload_enabled()) {
+ return dpif_offload_dpdk_enable_offload(offload_, port);
+ }
+ return 0;
+ }
+
+ free(port);
+ return EEXIST;
+}
+
+static int
+dpif_offload_dpdk_port_del(struct dpif_offload *offload_, odp_port_t port_no)
+{
+ struct dpif_offload_dpdk *offload = dpif_offload_dpdk_cast(offload_);
+ struct dpif_offload_port_mgr_port *port;
+ int ret = 0;
+
+ port = dpif_offload_port_mgr_remove(offload->port_mgr, port_no, true);
+ if (port) {
+ if (dpif_offload_is_offload_enabled()) {
+ ret = dpif_offload_dpdk_cleanup_offload(offload_, port);
+ }
+ netdev_close(port->netdev);
+ ovsrcu_postpone(free, port);
+ }
+ return ret;
+}
+
static int
dpif_offload_dpdk_open(const struct dpif_offload_class *offload_class,
struct dpif *dpif, struct dpif_offload **offload_)
@@ -55,20 +110,45 @@ dpif_offload_dpdk_open(const struct dpif_offload_class *offload_class,
offload = xmalloc(sizeof(struct dpif_offload_dpdk));
dpif_offload_init(&offload->offload, offload_class, dpif);
+ offload->port_mgr = dpif_offload_port_mgr_init();
offload->once_enable = (struct ovsthread_once) OVSTHREAD_ONCE_INITIALIZER;
*offload_ = &offload->offload;
return 0;
}
+static bool
+dpif_offload_dpdk_cleanup_port(struct dpif_offload_port_mgr_port *port,
+ void *aux)
+{
+ struct dpif_offload *offload_ = aux;
+
+ dpif_offload_dpdk_port_del(offload_, port->port_no);
+ return false;
+}
+
static void
dpif_offload_dpdk_close(struct dpif_offload *offload_)
{
struct dpif_offload_dpdk *offload = dpif_offload_dpdk_cast(offload_);
+ dpif_offload_port_mgr_traverse_ports(offload->port_mgr,
+ dpif_offload_dpdk_cleanup_port,
+ offload_);
+
+ dpif_offload_port_mgr_uninit(offload->port_mgr);
free(offload);
}
+static bool dpif_offload_dpdk_late_enable(struct dpif_offload_port_mgr_port *p,
+ void *aux)
+{
+ struct dpif_offload *offload_ = aux;
+
+ dpif_offload_dpdk_enable_offload(offload_, p);
+ return false;
+}
+
static void
dpif_offload_dpdk_set_config(struct dpif_offload *offload_,
const struct smap *other_cfg)
@@ -97,6 +177,10 @@ dpif_offload_dpdk_set_config(struct dpif_offload *offload_,
offload_thread_nb > 1 ? "s" : "");
}
+ dpif_offload_port_mgr_traverse_ports(offload->port_mgr,
+ dpif_offload_dpdk_late_enable,
+ offload);
+
ovsthread_once_done(&offload->once_enable);
}
}
@@ -125,6 +209,8 @@ struct dpif_offload_class dpif_offload_dpdk_class = {
.close = dpif_offload_dpdk_close,
.set_config = dpif_offload_dpdk_set_config,
.can_offload = dpif_offload_dpdk_can_offload,
+ .port_add = dpif_offload_dpdk_port_add,
+ .port_del = dpif_offload_dpdk_port_del,
};
/* XXX: Temporary functions below, which will be removed once fully
Existing dpdk offload provider is updated to use the new framework for port management. Signed-off-by: Eelco Chaudron <echaudro@redhat.com> --- lib/dpif-offload-dpdk.c | 86 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+)