Commit 7e7790c6 authored by Martin Mareš's avatar Martin Mareš
Browse files

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 ;-)
parent 8b168817
/*
* 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);
}
/*
* 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 ...@@ -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
/*
* 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;
}
/*
* 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
/*
* 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 @@ ...@@ -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 @@ ...@@ -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
uk_preconfig(struct protocol *x)
{
struct proto *p = proto_new(&proto_unix_kernel, sizeof(struct proto));
p->preference = DEF_PREF_UKR; p->p.preference = DEF_PREF_UKR;
p->rt_notify = uk_rt_notify; p->p.start = krt_start;
p->start = uk_start; p->p.shutdown = krt_shutdown;
} krt_scan_preconfig(p);
krt_set_preconfig(p);
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; ...@@ -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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment