aboutsummaryrefslogtreecommitdiffstats
path: root/adapter.c
diff options
context:
space:
mode:
Diffstat (limited to 'adapter.c')
-rw-r--r--adapter.c301
1 files changed, 0 insertions, 301 deletions
diff --git a/adapter.c b/adapter.c
deleted file mode 100644
index 1dbde9b..0000000
--- a/adapter.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2022-2023 Virtual Open Systems SAS
- *
- * Authors:
- * Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>
- * Stefanos Gerangelos <s.gerangelos@virtualopensystems.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <sys/eventfd.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <pthread.h>
-#include <stdbool.h>
-#include <sys/param.h>
-#include <assert.h>
-
-/* For socket */
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-/* Project header files */
-#include "adapter.h"
-
-/* Global variables */
-int client_sock;
-struct vhost_dev *dev;
-struct adapter_dev *adev;
-struct vhost_user *vudev;
-
-void vhost_user_adapter_init(void)
-{
-
- DBG("Setup adapter data structures\n");
-
- /* Init vhost-user device */
- vudev = (struct vhost_user *)malloc(sizeof(struct vhost_user));
-
- /* Init vhost device */
- dev = (struct vhost_dev *)malloc(sizeof(struct vhost_dev));
-
- /* Init virtio device */
- global_vdev = (VirtIODevice *)malloc(sizeof(VirtIODevice));
-
- /* Init virtio bus */
- global_vbus = (VirtioBus *)malloc(sizeof(VirtioBus));
- global_vbus->vdev = global_vdev;
- global_vdev->vbus = global_vbus;
- global_vdev->vhdev = dev;
-
-
- /* Store virtio_dev reference into vhost_dev struct*/
- dev->vdev = global_vdev;
-
- /* Init adapter device */
- adev = (struct adapter_dev *)malloc(sizeof(struct adapter_dev));
- adev->vdev = dev;
- adev->vudev = vudev;
- adev->virtio_dev = global_vdev;
- adev->vbus = global_vbus;
-}
-
-void client(char *sock_path)
-{
- int rc, len;
- struct sockaddr_un client_sockaddr;
-
- DBG("Create shared socket with vhost-user-device\n");
-
- /* Initialize the struct to zero */
- memset(&client_sockaddr, 0, sizeof(struct sockaddr_un));
-
- /*
- * Create a UNIX socket
- */
- client_sock = socket(AF_UNIX, SOCK_STREAM, 0);
- if (client_sock == -1) {
- DBG("SOCKET ERROR\n");
- exit(1);
- }
-
- /*
- * Set up the UNIX sockaddr structure
- * by using AF_UNIX for the family and
- * giving it a filepath to connect.
- */
- client_sockaddr.sun_family = AF_UNIX;
- strcpy(client_sockaddr.sun_path, sock_path);
- len = sizeof(client_sockaddr);
- rc = connect(client_sock, (struct sockaddr *) &client_sockaddr, len);
- if (rc == -1) {
- printf("CONNECT ERROR: Check the \"-s\" parameter\n");
- close(client_sock);
- exit(1);
- }
-}
-
-static void help_args(void)
-{
- printf("Run example:\n\t./adapter -s /path_to_socket/rng.sock\n"
- "\t\t -d device_name\n"
- "\t\t [ -qn number of queues ]\n"
- "\t\t [ -qs size of queues ]\n"
- "The 'device_name' can be one of the following:\n"
- "\tvrng, vhurng, vhublk, vhuinput, vhusnd, vhugpio, vhucan, vhuconsole\n");
-}
-
-int find_arg(int argc, char **argv, char *str)
-{
- int i;
-
- for (i = 0; i < argc; i++) {
- if (!strcmp(argv[i], str)) {
- return i + 1;
- }
- }
- return -1;
-}
-
-int val_device_arg(char *str)
-{
- int adapter_devices_num = ADAPTER_DEVS, i;
-
- for (i = 0; i < adapter_devices_num; i++) {
- if (!strcmp(adapter_devices[i], str)) {
- return i + 1;
- }
- }
-
- return 0;
-}
-
-bool check_vhu_device(char *str)
-{
- int vhu_devices_num = VHU_DEVS, i;
-
- for (i = 0; i < vhu_devices_num; i++) {
- if (!strcmp(vhu_devices[i], str)) {
- return true;
- }
- }
-
- return false;
-}
-
-void get_queue_num_size_args(int argc, char **argv,
- int *eval_queue_num, int *eval_queue_size)
-{
- int queue_num, queue_size, queue_num_id, queue_size_id;
-
- if (argc < 9) {
- return;
- }
-
- queue_num_id = find_arg(argc, argv, "-qn");
- queue_size_id = find_arg(argc, argv, "-qs");
-
- /* Check if both qs ans qn exist */
- if (queue_num_id < 0 || queue_size_id < 0) {
- return;
- }
-
- queue_num = atoi(argv[queue_num_id]);
- queue_size = atoi(argv[queue_size_id]);
-
- /* Evaluate number of queues */
- if (queue_num <= 0 || queue_num > 16) {
- return;
- }
-
- /* Evaluate queues' size */
- if (queue_size <= 0 || queue_size > 1024) {
- return;
- }
-
- *eval_queue_num = queue_num;
- *eval_queue_size = queue_size;
-}
-
-
-int main(int argc, char **argv)
-{
- int socket_idx, device_idx, device_id;
- bool vhost_user_enabled;
- /* Assign default queue num and size */
- int queue_num = 1, queue_size = 64;
-
- /*
- * Check if the user has provided all the required arguments.
- * If not, print the help messages.
- */
-
- if (argc < 3) {
- goto error_args;
- }
-
- device_idx = find_arg(argc, argv, "-d");
-
- if (device_idx < 0) {
- printf("You have not specified parameter \"-d\"\n");
- goto error_args;
- }
-
- /* Validate the argumetns */
- device_id = val_device_arg(argv[device_idx]);
-
- if (device_id == 0) {
- goto error_args;
- }
-
- /* Check if this is a vhost-user device */
- vhost_user_enabled = check_vhu_device(argv[device_idx]);
-
- /* Check if a socket is needed and provided */
- socket_idx = find_arg(argc, argv, "-s");
-
- if ((socket_idx < 0) && (vhost_user_enabled)) {
- printf("You have not specified parameter \"-s\"\n");
- goto error_args;
- }
-
- /*
- * Create the socket and connect to the backend.
- * Enabled on vhost-user case
- */
- if (vhost_user_enabled) {
- client(argv[socket_idx]);
- }
-
- /* Initialize the adapter data structures */
- vhost_user_adapter_init();
-
- /* Get queue number and size from arguments */
- get_queue_num_size_args(argc, argv, &queue_num, &queue_size);
-
- /* Initialize the virtio/vhost-user device */
- /* TODO: Switch numbers with name defs */
- switch (device_id) {
- case 1:
- virtio_rng_realize(queue_num, queue_size);
- break;
- case 2:
- vhost_user_rng_realize(queue_num, queue_size);
- break;
- case 3:
- printf("Running vhublk with num %d and size %d\n",
- queue_num, queue_size);
- vhost_user_blk_realize(queue_num, queue_size);
- break;
- case 4:
- vhost_user_input_init(global_vdev);
- virtio_input_device_realize(queue_num, queue_size);
- break;
- case 5:
- vus_device_realize(queue_num, queue_size);
- break;
- case 6:
- vu_gpio_device_realize(queue_num, queue_size);
- break;
- case 7:
- vhost_user_can_realize(queue_num, queue_size);
- break;
- case 8:
- vhost_user_console_realize(queue_num, queue_size);
- break;
- default:
- exit(1);
- }
-
- /*
- * Start loopback trasnport layer and communiation with the loopback driver
- */
- virtio_loopback_start();
-
- return 0;
-
-error_args:
- help_args();
- return 1;
-}