Makes krt.c much more readable.
This commit is contained in:
parent
6ac4f87a2d
commit
c6964c305b
7 changed files with 101 additions and 94 deletions
|
@ -681,15 +681,14 @@ static size_t kif_buflen = 4096;
|
||||||
void
|
void
|
||||||
krt_do_scan(struct krt_proto *p)
|
krt_do_scan(struct krt_proto *p)
|
||||||
{
|
{
|
||||||
krt_sysctl_scan((struct proto *)p, p->krt_pool, &krt_buffer, &krt_buflen, NET_RT_DUMP);
|
krt_sysctl_scan(&p->p, p->p.pool, &krt_buffer, &krt_buflen, NET_RT_DUMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
kif_do_scan(struct kif_proto *p)
|
kif_do_scan(struct kif_proto *p)
|
||||||
{
|
{
|
||||||
struct proto *P = (struct proto *)p;
|
|
||||||
if_start_update();
|
if_start_update();
|
||||||
krt_sysctl_scan(P, P->pool, &kif_buffer, &kif_buflen, NET_RT_IFLIST);
|
krt_sysctl_scan(&p->p, p->p.pool, &kif_buffer, &kif_buflen, NET_RT_IFLIST);
|
||||||
if_end_update();
|
if_end_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -708,7 +707,7 @@ krt_sock_hook(sock *sk, int size UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
krt_sys_start(struct krt_proto *x, int first UNUSED)
|
krt_sys_start(struct krt_proto *x)
|
||||||
{
|
{
|
||||||
sock *sk_rt;
|
sock *sk_rt;
|
||||||
static int ks_open_tried = 0;
|
static int ks_open_tried = 0;
|
||||||
|
@ -733,7 +732,7 @@ krt_sys_start(struct krt_proto *x, int first UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
krt_sys_shutdown(struct krt_proto *x UNUSED, int last UNUSED)
|
krt_sys_shutdown(struct krt_proto *x UNUSED)
|
||||||
{
|
{
|
||||||
if (!krt_buffer)
|
if (!krt_buffer)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
struct kif_params {
|
struct kif_params {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kif_status {
|
struct kif_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ static inline void kif_sys_copy_config(struct kif_config *d UNUSED, struct kif_c
|
||||||
struct krt_params {
|
struct krt_params {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct krt_status {
|
struct krt_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
struct kif_params {
|
struct kif_params {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kif_status {
|
struct kif_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ struct krt_params {
|
||||||
int table_id; /* Kernel table ID we sync with */
|
int table_id; /* Kernel table ID we sync with */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct krt_status {
|
struct krt_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,13 +10,13 @@ CF_HDR
|
||||||
|
|
||||||
CF_DECLS
|
CF_DECLS
|
||||||
|
|
||||||
CF_KEYWORDS(ASYNC, KERNEL, TABLE, KRT_PREFSRC, KRT_REALM)
|
CF_KEYWORDS(KERNEL, TABLE, KRT_PREFSRC, KRT_REALM)
|
||||||
|
|
||||||
CF_GRAMMAR
|
CF_GRAMMAR
|
||||||
|
|
||||||
CF_ADDTO(kern_proto, kern_proto nl_item ';')
|
CF_ADDTO(kern_proto, kern_proto kern_sys_item ';')
|
||||||
|
|
||||||
nl_item:
|
kern_sys_item:
|
||||||
KERNEL TABLE expr {
|
KERNEL TABLE expr {
|
||||||
if ($3 <= 0 || $3 >= NL_NUM_TABLES)
|
if ($3 <= 0 || $3 >= NL_NUM_TABLES)
|
||||||
cf_error("Kernel routing table number out of range");
|
cf_error("Kernel routing table number out of range");
|
||||||
|
|
|
@ -1086,18 +1086,16 @@ nl_open_async(void)
|
||||||
static u8 nl_cf_table[(NL_NUM_TABLES+7) / 8];
|
static u8 nl_cf_table[(NL_NUM_TABLES+7) / 8];
|
||||||
|
|
||||||
void
|
void
|
||||||
krt_sys_start(struct krt_proto *p, int first)
|
krt_sys_start(struct krt_proto *p)
|
||||||
{
|
{
|
||||||
nl_table_map[KRT_CF->sys.table_id] = p;
|
nl_table_map[KRT_CF->sys.table_id] = p;
|
||||||
if (first)
|
|
||||||
{
|
|
||||||
nl_open();
|
nl_open();
|
||||||
nl_open_async();
|
nl_open_async();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
krt_sys_shutdown(struct krt_proto *p UNUSED, int last UNUSED)
|
krt_sys_shutdown(struct krt_proto *p UNUSED)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,12 +69,14 @@
|
||||||
|
|
||||||
pool *krt_pool;
|
pool *krt_pool;
|
||||||
static linpool *krt_filter_lp;
|
static linpool *krt_filter_lp;
|
||||||
|
static list krt_proto_list;
|
||||||
|
|
||||||
void
|
void
|
||||||
krt_io_init(void)
|
krt_io_init(void)
|
||||||
{
|
{
|
||||||
krt_pool = rp_new(&root_pool, "Kernel Syncer");
|
krt_pool = rp_new(&root_pool, "Kernel Syncer");
|
||||||
krt_filter_lp = lp_new(krt_pool, 4080);
|
krt_filter_lp = lp_new(krt_pool, 4080);
|
||||||
|
init_list(&krt_proto_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -565,12 +567,6 @@ krt_dump_attrs(rte *e)
|
||||||
* Routes
|
* Routes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
|
||||||
static timer *krt_scan_timer;
|
|
||||||
static int krt_instance_count;
|
|
||||||
static list krt_instance_list;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
krt_flush_routes(struct krt_proto *p)
|
krt_flush_routes(struct krt_proto *p)
|
||||||
{
|
{
|
||||||
|
@ -812,34 +808,88 @@ krt_got_route_async(struct krt_proto *p, rte *e, int new)
|
||||||
* Periodic scanning
|
* Periodic scanning
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
||||||
|
|
||||||
|
static timer *krt_scan_timer;
|
||||||
|
static int krt_scan_count;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
krt_scan(timer *t UNUSED)
|
krt_scan(timer *t UNUSED)
|
||||||
{
|
{
|
||||||
struct krt_proto *p;
|
struct krt_proto *p;
|
||||||
|
|
||||||
kif_force_scan();
|
kif_force_scan();
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
|
||||||
{
|
|
||||||
void *q;
|
|
||||||
/* We need some node to decide whether to print the debug messages or not */
|
/* We need some node to decide whether to print the debug messages or not */
|
||||||
p = SKIP_BACK(struct krt_proto, instance_node, HEAD(krt_instance_list));
|
p = SKIP_BACK(struct krt_proto, krt_node, HEAD(krt_proto_list));
|
||||||
if (p->instance_node.next)
|
|
||||||
KRT_TRACE(p, D_EVENTS, "Scanning routing table");
|
KRT_TRACE(p, D_EVENTS, "Scanning routing table");
|
||||||
|
|
||||||
krt_do_scan(NULL);
|
krt_do_scan(NULL);
|
||||||
WALK_LIST(q, krt_instance_list)
|
|
||||||
|
void *q;
|
||||||
|
WALK_LIST(q, krt_proto_list)
|
||||||
{
|
{
|
||||||
p = SKIP_BACK(struct krt_proto, instance_node, q);
|
p = SKIP_BACK(struct krt_proto, krt_node, q);
|
||||||
krt_prune(p);
|
krt_prune(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_scan_timer_start(struct krt_proto *p)
|
||||||
|
{
|
||||||
|
if (!krt_scan_count)
|
||||||
|
{
|
||||||
|
krt_scan_timer = tm_new_set(krt_pool, krt_scan, NULL, 0, KRT_CF->scan_time);
|
||||||
|
tm_start(krt_scan_timer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
krt_scan_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_scan_timer_stop(struct krt_proto *p)
|
||||||
|
{
|
||||||
|
krt_scan_count--;
|
||||||
|
|
||||||
|
if (!krt_scan_count)
|
||||||
|
{
|
||||||
|
rfree(krt_scan_timer);
|
||||||
|
krt_scan_timer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
p = t->data;
|
|
||||||
|
static void
|
||||||
|
krt_scan(timer *t)
|
||||||
|
{
|
||||||
|
struct krt_proto *p = t->data;
|
||||||
|
|
||||||
|
kif_force_scan();
|
||||||
|
|
||||||
KRT_TRACE(p, D_EVENTS, "Scanning routing table");
|
KRT_TRACE(p, D_EVENTS, "Scanning routing table");
|
||||||
krt_do_scan(p);
|
krt_do_scan(p);
|
||||||
krt_prune(p);
|
krt_prune(p);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_scan_timer_start(struct krt_proto *p)
|
||||||
|
{
|
||||||
|
p->scan_timer = tm_new_set(p->p.pool, krt_scan, p, 0, KRT_CF->scan_time);
|
||||||
|
tm_start(p->scan_timer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_scan_timer_stop(struct krt_proto *p)
|
||||||
|
{
|
||||||
|
tm_stop(p->scan_timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Updates
|
* Updates
|
||||||
|
@ -942,52 +992,20 @@ krt_init(struct proto_config *c)
|
||||||
return &p->p;
|
return &p->p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static timer *
|
|
||||||
krt_start_timer(struct krt_proto *p)
|
|
||||||
{
|
|
||||||
timer *t;
|
|
||||||
|
|
||||||
t = tm_new(p->krt_pool);
|
|
||||||
t->hook = krt_scan;
|
|
||||||
t->data = p;
|
|
||||||
t->recurrent = KRT_CF->scan_time;
|
|
||||||
tm_start(t, 0);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
krt_start(struct proto *P)
|
krt_start(struct proto *P)
|
||||||
{
|
{
|
||||||
struct krt_proto *p = (struct krt_proto *) P;
|
struct krt_proto *p = (struct krt_proto *) P;
|
||||||
int first = 1;
|
|
||||||
|
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
add_tail(&krt_proto_list, &p->krt_node);
|
||||||
if (!krt_instance_count++)
|
|
||||||
init_list(&krt_instance_list);
|
|
||||||
else
|
|
||||||
first = 0;
|
|
||||||
p->krt_pool = krt_pool;
|
|
||||||
add_tail(&krt_instance_list, &p->instance_node);
|
|
||||||
#else
|
|
||||||
p->krt_pool = P->pool;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef KRT_ALLOW_LEARN
|
#ifdef KRT_ALLOW_LEARN
|
||||||
krt_learn_init(p);
|
krt_learn_init(p);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
krt_sys_start(p, first);
|
krt_sys_start(p);
|
||||||
|
|
||||||
/* Start periodic routing table scanning */
|
krt_scan_timer_start(p);
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
|
||||||
if (first)
|
|
||||||
krt_scan_timer = krt_start_timer(p);
|
|
||||||
else
|
|
||||||
tm_start(krt_scan_timer, 0);
|
|
||||||
p->scan_timer = krt_scan_timer;
|
|
||||||
#else
|
|
||||||
p->scan_timer = krt_start_timer(p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return PS_UP;
|
return PS_UP;
|
||||||
}
|
}
|
||||||
|
@ -996,26 +1014,16 @@ static int
|
||||||
krt_shutdown(struct proto *P)
|
krt_shutdown(struct proto *P)
|
||||||
{
|
{
|
||||||
struct krt_proto *p = (struct krt_proto *) P;
|
struct krt_proto *p = (struct krt_proto *) P;
|
||||||
int last = 1;
|
|
||||||
|
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
krt_scan_timer_stop(p);
|
||||||
rem_node(&p->instance_node);
|
|
||||||
if (--krt_instance_count)
|
|
||||||
last = 0;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
tm_stop(p->scan_timer);
|
|
||||||
|
|
||||||
/* FIXME we should flush routes even when persist during reconfiguration */
|
/* FIXME we should flush routes even when persist during reconfiguration */
|
||||||
if (p->initialized && !KRT_CF->persist)
|
if (p->initialized && !KRT_CF->persist)
|
||||||
krt_flush_routes(p);
|
krt_flush_routes(p);
|
||||||
|
|
||||||
krt_sys_shutdown(p, last);
|
krt_sys_shutdown(p);
|
||||||
|
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
rem_node(&p->krt_node);
|
||||||
if (last)
|
|
||||||
rfree(krt_scan_timer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return PS_DOWN;
|
return PS_DOWN;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,15 +52,17 @@ struct krt_config {
|
||||||
|
|
||||||
struct krt_proto {
|
struct krt_proto {
|
||||||
struct proto p;
|
struct proto p;
|
||||||
struct krt_status sys; /* Sysdep state */
|
struct krt_state sys; /* Sysdep state */
|
||||||
|
|
||||||
#ifdef KRT_ALLOW_LEARN
|
#ifdef KRT_ALLOW_LEARN
|
||||||
struct rtable krt_table; /* Internal table of inherited routes */
|
struct rtable krt_table; /* Internal table of inherited routes */
|
||||||
#endif
|
#endif
|
||||||
pool *krt_pool; /* Pool used for common krt data */
|
|
||||||
|
#ifndef CONFIG_ALL_TABLES_AT_ONCE
|
||||||
timer *scan_timer;
|
timer *scan_timer;
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
|
||||||
node instance_node; /* Node in krt instance list */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
node krt_node; /* Node in krt_proto_list */
|
||||||
int initialized; /* First scan has already been finished */
|
int initialized; /* First scan has already been finished */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -103,7 +105,7 @@ struct kif_config {
|
||||||
|
|
||||||
struct kif_proto {
|
struct kif_proto {
|
||||||
struct proto p;
|
struct proto p;
|
||||||
struct kif_status sys; /* Sysdep state */
|
struct kif_state sys; /* Sysdep state */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define KIF_CF ((struct kif_config *)p->p.cf)
|
#define KIF_CF ((struct kif_config *)p->p.cf)
|
||||||
|
@ -114,8 +116,8 @@ struct proto_config * krt_init_config(int class);
|
||||||
/* krt sysdep */
|
/* krt sysdep */
|
||||||
|
|
||||||
void krt_sys_init(struct krt_proto *);
|
void krt_sys_init(struct krt_proto *);
|
||||||
void krt_sys_start(struct krt_proto *, int);
|
void krt_sys_start(struct krt_proto *);
|
||||||
void krt_sys_shutdown(struct krt_proto *, int);
|
void krt_sys_shutdown(struct krt_proto *);
|
||||||
int krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o);
|
int krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o);
|
||||||
|
|
||||||
void krt_sys_preconfig(struct config *);
|
void krt_sys_preconfig(struct config *);
|
||||||
|
|
Loading…
Reference in a new issue