summaryrefslogtreecommitdiff
path: root/rumpnet/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'rumpnet/main.c')
-rw-r--r--rumpnet/main.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/rumpnet/main.c b/rumpnet/main.c
new file mode 100644
index 00000000..4385048f
--- /dev/null
+++ b/rumpnet/main.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2020 Free Software Foundation
+ *
+ * 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, 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, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <error.h>
+#include <argp.h>
+#include <version.h>
+
+#include <pthread.h>
+#include <mach.h>
+#include <mach/vm_param.h>
+#include "libshouldbeinlibc/wire.h"
+#include "libmachdev/machdev.h"
+#include "net-rump.h"
+
+mach_port_t bootstrap_resume_task = MACH_PORT_NULL;
+
+static const struct argp_option options[] = {
+ {"host-priv-port", 'h', "PORT", 0, "Host private port PORT"},
+ {"device-master-port",'d', "PORT", 0, "Device master port PORT"},
+ {"next-task", 'N', "TASK", 0, "Next bootstrap task TASK"},
+ {0}
+};
+
+
+/* Parse a command line option. */
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+ /* We save our parsed values in this structure, hung off STATE->hook.
+ Only after parsing all options successfully will we use these values. */
+ struct
+ {
+ int host_priv;
+ int dev_master;
+ int next_task;
+ } *values = state->hook;
+
+ switch (key)
+ {
+ case 'h':
+ values->host_priv = atoi(arg);
+ break;
+ case 'd':
+ values->dev_master = atoi(arg);
+ break;
+ case 'N':
+ values->next_task = atoi(arg);
+ break;
+
+ case ARGP_KEY_INIT:
+ state->child_inputs[0] = state->input;
+ values = malloc (sizeof *values);
+ if (values == 0)
+ return ENOMEM;
+ state->hook = values;
+ memset (values, 0, sizeof *values);
+ break;
+
+ case ARGP_KEY_SUCCESS:
+ /* All options parsed successfully */
+ _hurd_host_priv = values->host_priv;
+ _hurd_device_master = values->dev_master;
+ bootstrap_resume_task = values->next_task;
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+static struct argp_child empty_argp_children[] = {{0}};
+static struct argp rumpnet_argp = {options, parse_opt, 0, 0, empty_argp_children};
+static const struct argp *rumpnet_argp_bootup = &rumpnet_argp;
+
+static void *
+rumpnet_multithread_server(void *arg)
+{
+ do
+ {
+ ports_manage_port_operations_multithread (machdev_device_bucket,
+ machdev_demuxer,
+ 1000 * 60 * 2, /* 2 minute thread */
+ 1000 * 60 * 10, /* 10 minute server */
+ 0);
+ } while (1);
+
+ return NULL;
+}
+
+int
+main (int argc, char **argv)
+{
+ mach_port_t bootstrap = MACH_PORT_NULL;
+ int err;
+ pthread_t t;
+
+ setenv ("RUMP_NCPU", "1", 1);
+ setenv ("RUMP_VERBOSE", "1", 1);
+ setenv ("RUMP_HOSTNAME", "HURD0", 1);
+ setenv ("HOSTNAME", "HURD0", 1);
+ setenv ("RUMP_PANIC", "1", 1);
+
+ err = argp_parse (rumpnet_argp_bootup, argc, argv, 0, 0, NULL);
+ if (err)
+ {
+ error(1, err, "Missing parameters for bootstrap");
+ }
+
+ /* Make sure we will not swap out,
+ * because dma buffers for net drivers don't work otherwise.
+ * XXX rump must be using memory for dma that was not allocated with vm_allocate_contiguous (?) */
+ err = wire_task_self ();
+ if (err)
+ error (1, err, "cannot lock all memory");
+
+ rump_register_net ();
+ machdev_trivfs_init (argc, argv, bootstrap_resume_task, "rumpnet", "/dev/rumpnet", &bootstrap);
+ machdev_device_init ();
+ err = pthread_create (&t, NULL, rumpnet_multithread_server, NULL);
+ if (err)
+ return err;
+ pthread_detach (t);
+ machdev_trivfs_server_startup (bootstrap);
+ machdev_trivfs_server_loop (NULL);
+ /* Never reached */
+ return 0;
+}