summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO2
-rw-r--r--sysdep/cf/linux-21.h3
-rw-r--r--sysdep/linux/Modules4
-rw-r--r--sysdep/linux/netlink/Modules3
-rw-r--r--sysdep/linux/netlink/krt.Y46
-rw-r--r--sysdep/linux/netlink/krt.c87
-rw-r--r--sysdep/linux/netlink/krt.h30
7 files changed, 171 insertions, 4 deletions
diff --git a/TODO b/TODO
index c13bfa8e..ff7fd193 100644
--- a/TODO
+++ b/TODO
@@ -24,6 +24,8 @@ Core
- kernel: RTM_F_NOTIFY seems to be unimplemented
- kernel: RTM_DELROUTE not announced for device routes
+- netlink: import Linux route attributes to our rta's, so that they can be filtered?
+
Cleanup
~~~~~~~
- right usage of DBG vs. debug
diff --git a/sysdep/cf/linux-21.h b/sysdep/cf/linux-21.h
index a88d0ad1..7aeaab0a 100644
--- a/sysdep/cf/linux-21.h
+++ b/sysdep/cf/linux-21.h
@@ -1,7 +1,7 @@
/*
* Configuration for Linux 2.1 based systems
*
- * (c) 1998 Martin Mares <mj@ucw.cz>
+ * (c) 1998--1999 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -13,6 +13,7 @@
#define CONFIG_ALL_MULTICAST
/*
+Link: sysdep/linux/netlink
Link: sysdep/linux
Link: sysdep/unix
*/
diff --git a/sysdep/linux/Modules b/sysdep/linux/Modules
index 6af70552..03d032d9 100644
--- a/sysdep/linux/Modules
+++ b/sysdep/linux/Modules
@@ -1,6 +1,4 @@
-#ifdef CONFIG_NETLINK
-netlink.c
-#else
+#ifndef CONFIG_NETLINK
krt-scan.c
krt-scan.h
krt-scan.Y
diff --git a/sysdep/linux/netlink/Modules b/sysdep/linux/netlink/Modules
new file mode 100644
index 00000000..80338101
--- /dev/null
+++ b/sysdep/linux/netlink/Modules
@@ -0,0 +1,3 @@
+krt.c
+krt.h
+krt.Y
diff --git a/sysdep/linux/netlink/krt.Y b/sysdep/linux/netlink/krt.Y
new file mode 100644
index 00000000..c5726408
--- /dev/null
+++ b/sysdep/linux/netlink/krt.Y
@@ -0,0 +1,46 @@
+/*
+ * BIRD -- Netlink Interface Configuration
+ *
+ * (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+CF_HDR
+
+#include "lib/krt.h"
+
+#define KRT_PROTO ((struct krt_config *) this_proto)
+
+CF_DECLS
+
+CF_KEYWORDS(KERNEL, PERSIST, ROUTE, SCAN, TIME, LEARN)
+
+CF_GRAMMAR
+
+/* Kernel protocol */
+
+CF_ADDTO(proto, kern_proto '}')
+
+kern_proto_start: proto_start KERNEL {
+ if (!(this_proto = cf_krt)) cf_error("Kernel protocol already defined");
+ cf_krt = NULL;
+ }
+ ;
+
+kern_proto:
+ kern_proto_start '{'
+ | kern_proto proto_item ';'
+ | kern_proto kern_item ';'
+ ;
+
+kern_item:
+ PERSIST bool { KRT_PROTO->persist = $2; }
+ | SCAN TIME expr { KRT_PROTO->scan_time = $3; }
+ | LEARN bool { KRT_PROTO->learn = $2; }
+ | ROUTE SCAN TIME expr { KRT_PROTO->route_scan_time = $4; }
+ ;
+
+CF_CODE
+
+CF_END
diff --git a/sysdep/linux/netlink/krt.c b/sysdep/linux/netlink/krt.c
new file mode 100644
index 00000000..aae89185
--- /dev/null
+++ b/sysdep/linux/netlink/krt.c
@@ -0,0 +1,87 @@
+/*
+ * BIRD -- Linux Netlink Interface
+ *
+ * (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+
+#include "nest/bird.h"
+#include "nest/route.h"
+#include "nest/protocol.h"
+#include "nest/iface.h"
+#include "lib/timer.h"
+#include "lib/unix.h"
+#include "lib/krt.h"
+
+/*
+ * We need to work around namespace conflicts between us and the kernel,
+ * but I prefer this way to being forced to rename our configuration symbols.
+ * This will disappear as soon as netlink headers become part of the libc.
+ */
+
+#undef CONFIG_NETLINK
+#include <linux/config.h>
+#ifndef CONFIG_NETLINK
+#error "Kernel not configured to support netlink"
+#endif
+
+#include <asm/types.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+
+#define LOCAL_DEBUG
+
+struct proto_config *cf_krt;
+
+static void
+krt_preconfig(struct protocol *x, struct config *c)
+{
+ struct krt_config *z = proto_config_new(&proto_unix_kernel, sizeof(struct krt_config));
+
+ cf_krt = &z->c;
+ z->c.preference = DEF_PREF_UKR;
+}
+
+static struct proto *
+krt_init(struct proto_config *c)
+{
+ struct krt_proto *p = proto_new(c, sizeof(struct krt_proto));
+
+ return &p->p;
+}
+
+static int
+krt_start(struct proto *p)
+{
+ /* FIXME: Filter kernel routing table etc. */
+
+ return PS_UP;
+}
+
+static int
+krt_shutdown(struct proto *p)
+{
+ /* FIXME: Remove all our routes from the kernel */
+
+ return PS_DOWN;
+}
+
+void
+scan_if_init(void)
+{
+ /* FIXME: What to do here? */
+}
+
+struct protocol proto_unix_kernel = {
+ name: "Kernel",
+ preconfig: krt_preconfig,
+ init: krt_init,
+ start: krt_start,
+ shutdown: krt_shutdown
+};
diff --git a/sysdep/linux/netlink/krt.h b/sysdep/linux/netlink/krt.h
new file mode 100644
index 00000000..8dd55cc5
--- /dev/null
+++ b/sysdep/linux/netlink/krt.h
@@ -0,0 +1,30 @@
+/*
+ * BIRD -- Linux Netlink Interface
+ *
+ * (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_NETLINK_KRT_H_
+#define _BIRD_NETLINK_KRT_H_
+
+extern struct protocol proto_unix_kernel;
+
+struct krt_config {
+ struct proto_config c;
+ int persist; /* Keep routes when we exit */
+ int scan_time; /* How often we re-scan interfaces */
+ int route_scan_time; /* How often we re-scan routes */
+ int learn; /* Learn routes from other sources */
+};
+
+extern struct proto_config *cf_krt;
+
+struct krt_proto {
+ struct proto p;
+};
+
+void scan_if_init(void);
+
+#endif