Added skeletal version of Linux netlink interface. It doesn't work yet,

but the framework is there and I'll try finish it soon.
This commit is contained in:
Martin Mares 1999-03-01 20:17:46 +00:00
parent ea3582a6f6
commit bdb95a21a4
7 changed files with 171 additions and 4 deletions

2
TODO
View file

@ -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

View 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
*/

View file

@ -1,6 +1,4 @@
#ifdef CONFIG_NETLINK
netlink.c
#else
#ifndef CONFIG_NETLINK
krt-scan.c
krt-scan.h
krt-scan.Y

View file

@ -0,0 +1,3 @@
krt.c
krt.h
krt.Y

View file

@ -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

View file

@ -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
};

View file

@ -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