aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosep Puigdemont <josep.puigdemont@linaro.org>2017-06-28 10:30:09 +0200
committerJosep Puigdemont <josep.puigdemont@linaro.org>2017-11-13 09:43:33 +0100
commit485779a031f467eb242dec0a164b7380612494a4 (patch)
tree2a67bb7cae6804c79517c32e4f56a175f9c0d3c0
parent6cd43041e55bd73a02ca202f835e590b3ad5c354 (diff)
pktio: virtio: stub for a VirtIO-based packet IO
Signed-off-by: Josep Puigdemont <josep.puigdemont@linaro.org>
-rw-r--r--platform/linux-generic/Makefile.am2
-rw-r--r--platform/linux-generic/include/odp_pktio_ops_virtio.h14
-rw-r--r--platform/linux-generic/m4/configure.m43
-rw-r--r--platform/linux-generic/pktio/subsystem.c6
-rw-r--r--platform/linux-generic/pktio/virtio.c116
5 files changed, 141 insertions, 0 deletions
diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am
index 56ef03c6f..9b9936ddc 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -186,6 +186,7 @@ noinst_HEADERS = \
include/odp_pktio_ops_pcap.h \
include/odp_pktio_ops_socket.h \
include/odp_pktio_ops_tap.h \
+ include/odp_pktio_ops_virtio.h \
include/odp_pktio_ops_subsystem.h \
include/odp_pkt_queue_internal.h \
include/odp_queue_subsystem.h \
@@ -255,6 +256,7 @@ __LIB__libodp_linux_la_SOURCES = \
pktio/socket_mmap.c \
pktio/sysfs.c \
pktio/tap.c \
+ pktio/virtio.c \
pktio/ring.c \
pool/generic.c \
pool/subsystem.c \
diff --git a/platform/linux-generic/include/odp_pktio_ops_virtio.h b/platform/linux-generic/include/odp_pktio_ops_virtio.h
new file mode 100644
index 000000000..a8ace4143
--- /dev/null
+++ b/platform/linux-generic/include/odp_pktio_ops_virtio.h
@@ -0,0 +1,14 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef ODP_PACKET_VIRTIO_H
+#define ODP_PACKET_VIRTIO_H
+
+typedef struct {
+ char name[32]; /**< Unique identifier name */
+} pktio_ops_virtio_data_t;
+
+#endif
diff --git a/platform/linux-generic/m4/configure.m4 b/platform/linux-generic/m4/configure.m4
index fc29f9cb3..61a43fb89 100644
--- a/platform/linux-generic/m4/configure.m4
+++ b/platform/linux-generic/m4/configure.m4
@@ -47,3 +47,6 @@ AC_DEFINE([ODP_PKTIO_SOCKET], [1],
AC_DEFINE([ODP_PKTIO_SOCKET_MMAP], [1],
[Define to 1 to enable SOCKET_MMAP packet I/O support])
+
+AC_DEFINE([ODP_PKTIO_VIRTIO], [1],
+ [Define to 1 to enable VirtIO packet I/O support])
diff --git a/platform/linux-generic/pktio/subsystem.c b/platform/linux-generic/pktio/subsystem.c
index a3b36c144..17bc11647 100644
--- a/platform/linux-generic/pktio/subsystem.c
+++ b/platform/linux-generic/pktio/subsystem.c
@@ -44,6 +44,9 @@ extern int enable_link_socket_mmap_pktio_ops;
#ifdef ODP_PKTIO_TAP
extern int enable_link_tap_pktio_ops;
#endif
+#ifdef ODP_PKTIO_VIRTIO
+extern int enable_link_virtio_pktio_ops;
+#endif
ODP_SUBSYSTEM_CONSTRUCTOR(pktio_ops)
{
@@ -73,4 +76,7 @@ ODP_SUBSYSTEM_CONSTRUCTOR(pktio_ops)
#ifdef ODP_PKTIO_TAP
enable_link_tap_pktio_ops = 1;
#endif
+#ifdef ODP_PKTIO_VIRTIO
+ enable_link_virtio_pktio_ops = 1;
+#endif
}
diff --git a/platform/linux-generic/pktio/virtio.c b/platform/linux-generic/pktio/virtio.c
new file mode 100644
index 000000000..b46a642ae
--- /dev/null
+++ b/platform/linux-generic/pktio/virtio.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2017, Linaro Limited
+ *
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * devices are spcified as: pci:domain:bus:device.function
+ */
+
+#include "config.h"
+
+#ifdef ODP_PKTIO_VIRTIO
+
+#include <stdio.h>
+
+#include <odp_api.h>
+#include <odp_packet_internal.h>
+#include <odp_packet_io_internal.h>
+
+#include <odp_classification_internal.h>
+#include <odp_debug_internal.h>
+#include <odp/api/hints.h>
+
+#include <odp_pktio_ops_virtio.h>
+
+#define PCI_PKTIO_PREFIX "pci:"
+#define PCI_PKTIO_PREFIX_LEN (sizeof(PCI_PKTIO_PREFIX) - 1)
+
+static int virtio_init_global(void)
+{
+ ODP_PRINT("PKTIO: initialized pci interface.\n");
+ return 0;
+}
+
+static int virtio_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
+ const char *devname, odp_pool_t pool ODP_UNUSED)
+{
+ static unsigned int dev_id = 0;
+ pktio_ops_virtio_data_t *virtio_entry = odp_ops_data(pktio_entry,
+ virtio);
+
+ if (strncmp(devname, PCI_PKTIO_PREFIX, PCI_PKTIO_PREFIX_LEN))
+ return -1;
+
+ memset(virtio_entry, 0, sizeof(pktio_ops_virtio_data_t));
+ snprintf(virtio_entry->name,
+ sizeof(virtio_entry->name),
+ "virtio_%u",
+ dev_id++);
+
+ ODP_PRINT("virtio: opened %s\n", virtio_entry->name);
+
+ return 0;
+}
+
+static int virtio_close(pktio_entry_t *pktio_entry ODP_UNUSED)
+{
+ return 0;
+}
+
+static int virtio_recv(pktio_entry_t *pktio_entry ODP_UNUSED, int index ODP_UNUSED,
+ odp_packet_t pkts[] ODP_UNUSED, int len ODP_UNUSED)
+{
+ return 0;
+}
+
+static int virtio_send(pktio_entry_t *pktio_entry ODP_UNUSED, int index ODP_UNUSED,
+ const odp_packet_t pkt_tbl[] ODP_UNUSED, int len)
+{
+ return len;
+}
+
+static pktio_ops_module_t virtio_pktio_ops = {
+ .base = {
+ .name = "virtio-net",
+ .init_local = NULL,
+ .term_local = NULL,
+ .init_global = virtio_init_global,
+ .term_global = NULL,
+ },
+ .open = virtio_open,
+ .close = virtio_close,
+ .start = NULL,
+ .stop = NULL,
+ .stats = NULL,
+ .stats_reset = NULL,
+ .pktin_ts_res = NULL,
+ .pktin_ts_from_ns = NULL,
+ .recv = virtio_recv,
+ .send = virtio_send,
+ .mtu_get = NULL,
+ .promisc_mode_set = NULL,
+ .promisc_mode_get = NULL,
+ .mac_get = NULL,
+ .link_status = NULL,
+ .capability = NULL,
+ .config = NULL,
+ .input_queues_config = NULL,
+ .output_queues_config = NULL,
+ .print = NULL,
+};
+
+ODP_MODULE_CONSTRUCTOR(virtio_pktio_ops)
+{
+ odp_module_constructor(&virtio_pktio_ops);
+
+ odp_subsystem_register_module(pktio_ops, &virtio_pktio_ops);
+}
+
+/* Temporary variable to enable linking this module in,
+ * shall be removed later
+ */
+int enable_link_virtio_pktio_ops = 0;
+
+#endif