Kernel route syncer now supports dynamic reconfiguration. Also it doesn't
depend on the startup counter hack now and uses a zero-time timer instead to make itself scheduled after normal protocol startup.
This commit is contained in:
parent
fb89b1a4ce
commit
aa8761de94
6 changed files with 35 additions and 10 deletions
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* BIRD -- Linux Kernel Route Syncer -- Scanning
|
* BIRD -- Linux Kernel Route Syncer -- Scanning
|
||||||
*
|
*
|
||||||
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
|
* (c) 1998--2000 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.
|
||||||
*/
|
*/
|
||||||
|
@ -16,4 +16,6 @@ struct krt_scan_status {
|
||||||
list temp_ifs; /* Temporary interfaces */
|
list temp_ifs; /* Temporary interfaces */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline int krt_scan_params_same(struct krt_scan_params *o, struct krt_scan_params *n) { return 1; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* BIRD -- Linux Kernel Netlink Route Syncer -- Scanning
|
* BIRD -- Linux Kernel Netlink Route Syncer -- Scanning
|
||||||
*
|
*
|
||||||
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
|
* (c) 1998--2000 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.
|
||||||
*/
|
*/
|
||||||
|
@ -30,4 +30,9 @@ struct krt_scan_status {
|
||||||
list temp_ifs; /* Temporary interfaces */
|
list temp_ifs; /* Temporary interfaces */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline int krt_scan_params_same(struct krt_scan_params *o, struct krt_scan_params *n)
|
||||||
|
{
|
||||||
|
return o->async == n->async && o->table_id == n->table_id;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* BIRD -- Unix Kernel Netlink Route Syncer -- Dummy Include File
|
* BIRD -- Unix Kernel Netlink Route Syncer -- Dummy Include File
|
||||||
*
|
*
|
||||||
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
|
* (c) 1998--2000 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.
|
||||||
*/
|
*/
|
||||||
|
@ -22,5 +22,6 @@ struct krt_set_status {
|
||||||
static inline void krt_set_construct(struct krt_config *c) { };
|
static inline void krt_set_construct(struct krt_config *c) { };
|
||||||
static inline void krt_set_start(struct krt_proto *p, int first) { };
|
static inline void krt_set_start(struct krt_proto *p, int first) { };
|
||||||
static inline void krt_set_shutdown(struct krt_proto *p, int last) { };
|
static inline void krt_set_shutdown(struct krt_proto *p, int last) { };
|
||||||
|
static inline int krt_set_params_same(struct krt_set_params *o, struct krt_set_params *n) { return 1; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* BIRD -- Unix Kernel Route Syncer -- Setting
|
* BIRD -- Unix Kernel Route Syncer -- Setting
|
||||||
*
|
*
|
||||||
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
|
* (c) 1998--2000 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.
|
||||||
*/
|
*/
|
||||||
|
@ -15,4 +15,6 @@ struct krt_set_params {
|
||||||
struct krt_set_status {
|
struct krt_set_status {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline int krt_set_params_same(struct krt_set_params *o, struct krt_set_params *n) { return 1; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -582,6 +582,7 @@ krt_prune(struct krt_proto *p)
|
||||||
if (KRT_CF->learn)
|
if (KRT_CF->learn)
|
||||||
krt_learn_prune(p);
|
krt_learn_prune(p);
|
||||||
#endif
|
#endif
|
||||||
|
p->initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -661,7 +662,8 @@ krt_notify(struct proto *P, net *net, rte *new, rte *old, struct ea_list *tmpa)
|
||||||
net->n.flags |= KRF_INSTALLED;
|
net->n.flags |= KRF_INSTALLED;
|
||||||
else
|
else
|
||||||
net->n.flags &= ~KRF_INSTALLED;
|
net->n.flags &= ~KRF_INSTALLED;
|
||||||
krt_set_notify(p, net, new, old);
|
if (p->initialized) /* Before first scan we don't touch the routes */
|
||||||
|
krt_set_notify(p, net, new, old);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -703,7 +705,7 @@ krt_start_timer(struct krt_proto *p)
|
||||||
t->hook = krt_scan;
|
t->hook = krt_scan;
|
||||||
t->data = p;
|
t->data = p;
|
||||||
t->recurrent = KRT_CF->scan_time;
|
t->recurrent = KRT_CF->scan_time;
|
||||||
tm_start(t, KRT_CF->scan_time);
|
tm_start(t, 0);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -735,13 +737,11 @@ krt_start(struct proto *P)
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
||||||
if (first)
|
if (first)
|
||||||
krt_scan_timer = krt_start_timer(p);
|
krt_scan_timer = krt_start_timer(p);
|
||||||
|
else
|
||||||
|
tm_start(p->scan_timer, 0);
|
||||||
p->scan_timer = krt_scan_timer;
|
p->scan_timer = krt_scan_timer;
|
||||||
/* If this is the last instance to be initialized, kick the timer */
|
|
||||||
if (!P->proto->startup_counter)
|
|
||||||
krt_scan(p->scan_timer);
|
|
||||||
#else
|
#else
|
||||||
p->scan_timer = krt_start_timer(p);
|
p->scan_timer = krt_start_timer(p);
|
||||||
krt_scan(p->scan_timer);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return PS_UP;
|
return PS_UP;
|
||||||
|
@ -785,6 +785,19 @@ krt_init(struct proto_config *c)
|
||||||
return &p->p;
|
return &p->p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
krt_reconfigure(struct proto *p, struct proto_config *new)
|
||||||
|
{
|
||||||
|
struct krt_config *o = (struct krt_config *) p->cf;
|
||||||
|
struct krt_config *n = (struct krt_config *) new;
|
||||||
|
|
||||||
|
return o->scan_time == n->scan_time
|
||||||
|
&& o->learn == n->learn /* persist needn't be the same */
|
||||||
|
&& krt_set_params_same(&o->set, &n->set)
|
||||||
|
&& krt_scan_params_same(&o->scan, &n->scan)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
struct protocol proto_unix_kernel = {
|
struct protocol proto_unix_kernel = {
|
||||||
name: "Kernel",
|
name: "Kernel",
|
||||||
template: "kernel%d",
|
template: "kernel%d",
|
||||||
|
@ -794,6 +807,7 @@ struct protocol proto_unix_kernel = {
|
||||||
init: krt_init,
|
init: krt_init,
|
||||||
start: krt_start,
|
start: krt_start,
|
||||||
shutdown: krt_shutdown,
|
shutdown: krt_shutdown,
|
||||||
|
reconfigure: krt_reconfigure,
|
||||||
#ifdef KRT_ALLOW_LEARN
|
#ifdef KRT_ALLOW_LEARN
|
||||||
dump: krt_dump,
|
dump: krt_dump,
|
||||||
dump_attrs: krt_dump_attrs,
|
dump_attrs: krt_dump_attrs,
|
||||||
|
|
|
@ -62,6 +62,7 @@ struct krt_proto {
|
||||||
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
#ifdef CONFIG_ALL_TABLES_AT_ONCE
|
||||||
node instance_node; /* Node in krt instance list */
|
node instance_node; /* Node in krt instance list */
|
||||||
#endif
|
#endif
|
||||||
|
int initialized; /* First scan has already been finished */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct proto_config *cf_krt;
|
extern struct proto_config *cf_krt;
|
||||||
|
|
Loading…
Reference in a new issue