diff options
author | Josep Puigdemont <josep.puigdemont@linaro.org> | 2017-06-28 10:30:09 +0200 |
---|---|---|
committer | Josep Puigdemont <josep.puigdemont@linaro.org> | 2017-11-13 09:43:33 +0100 |
commit | 485779a031f467eb242dec0a164b7380612494a4 (patch) | |
tree | 2a67bb7cae6804c79517c32e4f56a175f9c0d3c0 | |
parent | 6cd43041e55bd73a02ca202f835e590b3ad5c354 (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.am | 2 | ||||
-rw-r--r-- | platform/linux-generic/include/odp_pktio_ops_virtio.h | 14 | ||||
-rw-r--r-- | platform/linux-generic/m4/configure.m4 | 3 | ||||
-rw-r--r-- | platform/linux-generic/pktio/subsystem.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/pktio/virtio.c | 116 |
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 |