summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-05-18 00:36:15 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-05-18 00:36:15 +0200
commitcbcbaaeda0dd92b61ed8ef0dfaab11590aec39b3 (patch)
tree2b5e23c67a5f3e4756a1fe6fa07c1843a0d334e4
parent4e055302edd46137d1b207afea8ea1fab1999748 (diff)
Add safeguard against kernel with network drivers
If the kernel has a network device, execute devnode instead, to make pfinet use the kernel driver. * check_kernel.c: New file. * check_kernel.h: New file. * Makefile (SRC_C): Add check_kernel.c * main.c: Include "check_kernel.h" (main): Call check_kernel.
-rw-r--r--Makefile2
-rw-r--r--check_kernel.c50
-rw-r--r--check_kernel.h1
-rw-r--r--main.c3
4 files changed, 55 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 8a83573a7..38d463dcf 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ include Makeconf.local
TARGET = netdde
-SRC_C = main.c
+SRC_C = main.c check_kernel.c
LIBS += $(libmachdev_path) -ldde_linux26.o -ldde_linux26_net $(libddekit_path) -lfshelp -ltrivfs -lpciaccess -lz -lthreads -lshouldbeinlibc -lports $(libslab_path) $(libbpf_path)
CFLAGS += -g -I$(PKGDIR)/include -I$(BUILDDIR)/include
diff --git a/check_kernel.c b/check_kernel.c
new file mode 100644
index 000000000..717895c81
--- /dev/null
+++ b/check_kernel.c
@@ -0,0 +1,50 @@
+/*!
+ Copyright (C) 2012 Free Software Foundation, Inc.
+ Written by Samuel Thibault.
+
+ This file is part of the GNU Hurd.
+
+ The GNU Hurd 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.
+
+ The GNU Hurd 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 the GNU Hurd; see the file COPYING. If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <hurd.h>
+#include <mach.h>
+#include <device/device.h>
+
+#include "check_kernel.h"
+
+void check_kernel(void) {
+ mach_port_t device_master;
+
+ if (! get_privileged_ports (0, &device_master))
+ {
+ device_t device;
+
+ if (! device_open (device_master, D_READ, "eth0", &device))
+ {
+ error_t err;
+
+ fprintf (stderr, "Kernel is already driving a network device, starting devnode instead of netdde\n");
+ err = execl ("/hurd/devnode", "devnode", "eth0", NULL);
+ error (1, err, "Invocation of devnode failed");
+ }
+ }
+
+ mach_port_deallocate (mach_task_self (), device_master);
+}
diff --git a/check_kernel.h b/check_kernel.h
new file mode 100644
index 000000000..d74150489
--- /dev/null
+++ b/check_kernel.h
@@ -0,0 +1 @@
+void check_kernel(void);
diff --git a/main.c b/main.c
index 98f4452ab..d9eacaf85 100644
--- a/main.c
+++ b/main.c
@@ -7,11 +7,14 @@
#include <linux/delay.h> // msleep()
#include <hurd/machdev.h>
+#include "check_kernel.h"
int using_std = 1;
int main(int argc, char **argv)
{
+ check_kernel();
+
l4dde26_init();
l4dde26_process_init();
l4dde26_softirq_init();