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_F_NOTIFY seems to be unimplemented
|
||||||
- kernel: RTM_DELROUTE not announced for device routes
|
- kernel: RTM_DELROUTE not announced for device routes
|
||||||
|
|
||||||
|
- netlink: import Linux route attributes to our rta's, so that they can be filtered?
|
||||||
|
|
||||||
Cleanup
|
Cleanup
|
||||||
~~~~~~~
|
~~~~~~~
|
||||||
- right usage of DBG vs. debug
|
- right usage of DBG vs. debug
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Configuration for Linux 2.1 based systems
|
* 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.
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
*/
|
*/
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
#define CONFIG_ALL_MULTICAST
|
#define CONFIG_ALL_MULTICAST
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Link: sysdep/linux/netlink
|
||||||
Link: sysdep/linux
|
Link: sysdep/linux
|
||||||
Link: sysdep/unix
|
Link: sysdep/unix
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
#ifdef CONFIG_NETLINK
|
#ifndef CONFIG_NETLINK
|
||||||
netlink.c
|
|
||||||
#else
|
|
||||||
krt-scan.c
|
krt-scan.c
|
||||||
krt-scan.h
|
krt-scan.h
|
||||||
krt-scan.Y
|
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