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:
parent
ea3582a6f6
commit
bdb95a21a4
7 changed files with 171 additions and 4 deletions
2
TODO
2
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
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
#ifdef CONFIG_NETLINK
|
||||
netlink.c
|
||||
#else
|
||||
#ifndef CONFIG_NETLINK
|
||||
krt-scan.c
|
||||
krt-scan.h
|
||||
krt-scan.Y
|
||||
|
|
3
sysdep/linux/netlink/Modules
Normal file
3
sysdep/linux/netlink/Modules
Normal file
|
@ -0,0 +1,3 @@
|
|||
krt.c
|
||||
krt.h
|
||||
krt.Y
|
46
sysdep/linux/netlink/krt.Y
Normal file
46
sysdep/linux/netlink/krt.Y
Normal 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
|
87
sysdep/linux/netlink/krt.c
Normal file
87
sysdep/linux/netlink/krt.c
Normal 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
|
||||
};
|
30
sysdep/linux/netlink/krt.h
Normal file
30
sysdep/linux/netlink/krt.h
Normal 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
|
Loading…
Reference in a new issue