]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added skeletal version of Linux netlink interface. It doesn't work yet,
authorMartin Mares <mj@ucw.cz>
Mon, 1 Mar 1999 20:17:46 +0000 (20:17 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 1 Mar 1999 20:17:46 +0000 (20:17 +0000)
but the framework is there and I'll try finish it soon.

TODO
sysdep/cf/linux-21.h
sysdep/linux/Modules
sysdep/linux/netlink/Modules [new file with mode: 0644]
sysdep/linux/netlink/krt.Y [new file with mode: 0644]
sysdep/linux/netlink/krt.c [new file with mode: 0644]
sysdep/linux/netlink/krt.h [new file with mode: 0644]

diff --git a/TODO b/TODO
index c13bfa8e88e6faa721240755cd01671e174bc3a6..ff7fd1939fd821c672c1ee655b4da7f73b5c5495 100644 (file)
--- 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
index a88d0ad1d245a44099eac73f237f8808cf5ac688..7aeaab0a84b59a73e3f8dd84ff88a78cfaf93fdd 100644 (file)
@@ -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
  */
index 6af70552dbc48b3eb1d648a67cbf245063742ab8..03d032d9891224b2fbfb87574073594ecc55e53d 100644 (file)
@@ -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 (file)
index 0000000..8033810
--- /dev/null
@@ -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 (file)
index 0000000..c572640
--- /dev/null
@@ -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 (file)
index 0000000..aae8918
--- /dev/null
@@ -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 (file)
index 0000000..8dd55cc
--- /dev/null
@@ -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