Since almost every UNIX system requires different techniques for reading
the kernel routing table as opposed to modifying it which is approximately the same on non-netlink systems, I've split the kernel routing table routines to read and write parts. To be implemented later ;-)
This commit is contained in:
parent
8b1688177b
commit
7e7790c61f
10 changed files with 183 additions and 24 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
krt-scan.c
|
||||||
|
krt-scan.h
|
58
sysdep/linux/krt-scan.c
Normal file
58
sysdep/linux/krt-scan.c
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* BIRD -- Linux Routing Table Scanning
|
||||||
|
*
|
||||||
|
* (c) 1998 Martin Mares <mj@ucw.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define LOCAL_DEBUG
|
||||||
|
|
||||||
|
#include "nest/bird.h"
|
||||||
|
#include "nest/iface.h"
|
||||||
|
#include "nest/route.h"
|
||||||
|
#include "nest/protocol.h"
|
||||||
|
#include "lib/timer.h"
|
||||||
|
#include "lib/unix.h"
|
||||||
|
#include "lib/krt.h"
|
||||||
|
|
||||||
|
#define SCANOPT struct krt_scan_params *p = &x->scanopt
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_scan_fire(timer *t)
|
||||||
|
{
|
||||||
|
DBG("Scanning kernel table...\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
krt_scan_preconfig(struct krt_proto *x)
|
||||||
|
{
|
||||||
|
SCANOPT;
|
||||||
|
|
||||||
|
p->recurrence = 10; /* FIXME: use reasonable default value */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
krt_scan_start(struct krt_proto *x)
|
||||||
|
{
|
||||||
|
SCANOPT;
|
||||||
|
timer *t = tm_new(x->p.pool);
|
||||||
|
|
||||||
|
p->timer = t;
|
||||||
|
t->hook = krt_scan_fire;
|
||||||
|
t->data = x;
|
||||||
|
t->recurrent = p->recurrence;
|
||||||
|
krt_scan_fire(t);
|
||||||
|
if (t->recurrent)
|
||||||
|
tm_start(t, t->recurrent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
krt_scan_shutdown(struct krt_proto *x)
|
||||||
|
{
|
||||||
|
SCANOPT;
|
||||||
|
|
||||||
|
tm_stop(p->timer);
|
||||||
|
}
|
17
sysdep/linux/krt-scan.h
Normal file
17
sysdep/linux/krt-scan.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* BIRD -- Linux Kernel Route Syncer -- Scanning Parameters
|
||||||
|
*
|
||||||
|
* (c) 1998 Martin Mares <mj@ucw.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BIRD_KRT_SCAN_H_
|
||||||
|
#define _BIRD_KRT_SCAN_H_
|
||||||
|
|
||||||
|
struct krt_scan_params {
|
||||||
|
int recurrence; /* How often should we scan krt, 0=only on startup */
|
||||||
|
struct timer *timer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -5,3 +5,6 @@ io.c
|
||||||
unix.h
|
unix.h
|
||||||
sync-if.c
|
sync-if.c
|
||||||
sync-rt.c
|
sync-rt.c
|
||||||
|
krt.h
|
||||||
|
krt-set.c
|
||||||
|
krt-set.h
|
||||||
|
|
35
sysdep/unix/krt-set.c
Normal file
35
sysdep/unix/krt-set.c
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* BIRD -- Unix Routing Table Syncing
|
||||||
|
*
|
||||||
|
* (c) 1998 Martin Mares <mj@ucw.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#define LOCAL_DEBUG
|
||||||
|
|
||||||
|
#include "nest/bird.h"
|
||||||
|
#include "nest/iface.h"
|
||||||
|
#include "nest/route.h"
|
||||||
|
#include "nest/protocol.h"
|
||||||
|
#include "lib/timer.h"
|
||||||
|
#include "lib/unix.h"
|
||||||
|
#include "lib/krt.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
krt_set_notify(struct proto *x, net *net, rte *new, rte *old)
|
||||||
|
{
|
||||||
|
DBG("krt_set_notify(%I/%d)\n", net->n.prefix, net->n.pxlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
krt_set_preconfig(struct krt_proto *x)
|
||||||
|
{
|
||||||
|
x->p.rt_notify = krt_set_notify;
|
||||||
|
}
|
15
sysdep/unix/krt-set.h
Normal file
15
sysdep/unix/krt-set.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* BIRD -- Unix Kernel Route Syncer -- Setting Parameters
|
||||||
|
*
|
||||||
|
* (c) 1998 Martin Mares <mj@ucw.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BIRD_KRT_SET_H_
|
||||||
|
#define _BIRD_KRT_SET_H_
|
||||||
|
|
||||||
|
struct krt_set_params {
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
35
sysdep/unix/krt.h
Normal file
35
sysdep/unix/krt.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* BIRD -- Unix Kernel Route Syncer
|
||||||
|
*
|
||||||
|
* (c) 1998 Martin Mares <mj@ucw.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BIRD_KRT_H_
|
||||||
|
#define _BIRD_KRT_H_
|
||||||
|
|
||||||
|
#include "lib/krt-scan.h"
|
||||||
|
#include "lib/krt-set.h"
|
||||||
|
|
||||||
|
/* sync-rt.c */
|
||||||
|
|
||||||
|
extern struct protocol proto_unix_kernel;
|
||||||
|
|
||||||
|
struct krt_proto {
|
||||||
|
struct proto p;
|
||||||
|
struct krt_set_params setopt;
|
||||||
|
struct krt_scan_params scanopt;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* krt-scan.c */
|
||||||
|
|
||||||
|
void krt_scan_preconfig(struct krt_proto *);
|
||||||
|
void krt_scan_start(struct krt_proto *);
|
||||||
|
void krt_scan_shutdown(struct krt_proto *);
|
||||||
|
|
||||||
|
/* krt-set.c */
|
||||||
|
|
||||||
|
void krt_set_preconfig(struct krt_proto *);
|
||||||
|
|
||||||
|
#endif
|
|
@ -19,6 +19,7 @@
|
||||||
#include "nest/confile.h"
|
#include "nest/confile.h"
|
||||||
|
|
||||||
#include "unix.h"
|
#include "unix.h"
|
||||||
|
#include "krt.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging
|
* Debugging
|
||||||
|
|
|
@ -21,42 +21,39 @@
|
||||||
#include "lib/timer.h"
|
#include "lib/timer.h"
|
||||||
|
|
||||||
#include "unix.h"
|
#include "unix.h"
|
||||||
|
#include "krt.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
uk_rt_notify(struct proto *p, net *net, rte *new, rte *old)
|
krt_start(struct proto *P)
|
||||||
{
|
{
|
||||||
|
struct krt_proto *p = (struct krt_proto *) P;
|
||||||
|
krt_scan_start(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
uk_start(struct proto *p)
|
krt_shutdown(struct proto *P, int time)
|
||||||
{
|
{
|
||||||
|
struct krt_proto *p = (struct krt_proto *) P;
|
||||||
|
krt_scan_shutdown(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
uk_init(struct protocol *x)
|
krt_preconfig(struct protocol *x)
|
||||||
{
|
{
|
||||||
}
|
struct krt_proto *p = (struct krt_proto *) proto_new(&proto_unix_kernel, sizeof(struct krt_proto));
|
||||||
|
|
||||||
void
|
p->p.preference = DEF_PREF_UKR;
|
||||||
uk_preconfig(struct protocol *x)
|
p->p.start = krt_start;
|
||||||
{
|
p->p.shutdown = krt_shutdown;
|
||||||
struct proto *p = proto_new(&proto_unix_kernel, sizeof(struct proto));
|
krt_scan_preconfig(p);
|
||||||
|
krt_set_preconfig(p);
|
||||||
p->preference = DEF_PREF_UKR;
|
|
||||||
p->rt_notify = uk_rt_notify;
|
|
||||||
p->start = uk_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
uk_postconfig(struct protocol *x)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct protocol proto_unix_kernel = {
|
struct protocol proto_unix_kernel = {
|
||||||
{ NULL, NULL },
|
{ NULL, NULL },
|
||||||
"kernel",
|
"kernel",
|
||||||
0,
|
0,
|
||||||
uk_init,
|
NULL, /* init */
|
||||||
uk_preconfig,
|
krt_preconfig,
|
||||||
uk_postconfig
|
NULL /* postconfig */
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,8 +22,4 @@ extern int if_scan_period;
|
||||||
|
|
||||||
void scan_if_init(void);
|
void scan_if_init(void);
|
||||||
|
|
||||||
/* sync-rt.c */
|
|
||||||
|
|
||||||
extern struct protocol proto_unix_kernel;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue