summaryrefslogtreecommitdiffstats
path: root/sysdep/linux/netlink
diff options
context:
space:
mode:
Diffstat (limited to 'sysdep/linux/netlink')
-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
4 files changed, 166 insertions, 0 deletions
diff --git a/sysdep/linux/netlink/Modules b/sysdep/linux/netlink/Modules
new file mode 100644
index 0000000..8033810
--- /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 0000000..c572640
--- /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 0000000..aae8918
--- /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 0000000..8dd55cc
--- /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