diff options
author | Martin Mares <mj@ucw.cz> | 2000-01-18 11:39:30 +0100 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2000-01-18 11:39:30 +0100 |
commit | aa8761de9471dbe28149d990bdbc851c744f4e2b (patch) | |
tree | 1121c4a4ca8840e4009b7d84d36097dd697d5f0d | |
parent | fb89b1a4ced5f3d847ecbc1d4b86a0cb47564ef7 (diff) | |
download | bird-aa8761de9471dbe28149d990bdbc851c744f4e2b.tar bird-aa8761de9471dbe28149d990bdbc851c744f4e2b.zip |
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.
-rw-r--r-- | sysdep/linux/krt-scan.h | 4 | ||||
-rw-r--r-- | sysdep/linux/netlink/krt-scan.h | 7 | ||||
-rw-r--r-- | sysdep/linux/netlink/krt-set.h | 3 | ||||
-rw-r--r-- | sysdep/unix/krt-set.h | 4 | ||||
-rw-r--r-- | sysdep/unix/krt.c | 26 | ||||
-rw-r--r-- | sysdep/unix/krt.h | 1 |
6 files changed, 35 insertions, 10 deletions
diff --git a/sysdep/linux/krt-scan.h b/sysdep/linux/krt-scan.h index c5bf588..6c7e440 100644 --- a/sysdep/linux/krt-scan.h +++ b/sysdep/linux/krt-scan.h @@ -1,7 +1,7 @@ /* * 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. */ @@ -16,4 +16,6 @@ struct krt_scan_status { 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 diff --git a/sysdep/linux/netlink/krt-scan.h b/sysdep/linux/netlink/krt-scan.h index cdfe444..ec10a7f 100644 --- a/sysdep/linux/netlink/krt-scan.h +++ b/sysdep/linux/netlink/krt-scan.h @@ -1,7 +1,7 @@ /* * 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. */ @@ -30,4 +30,9 @@ struct krt_scan_status { 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 diff --git a/sysdep/linux/netlink/krt-set.h b/sysdep/linux/netlink/krt-set.h index 48df5ec..4f35e09 100644 --- a/sysdep/linux/netlink/krt-set.h +++ b/sysdep/linux/netlink/krt-set.h @@ -1,7 +1,7 @@ /* * 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. */ @@ -22,5 +22,6 @@ struct krt_set_status { 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_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 diff --git a/sysdep/unix/krt-set.h b/sysdep/unix/krt-set.h index cfa5fb7..1c5e15e 100644 --- a/sysdep/unix/krt-set.h +++ b/sysdep/unix/krt-set.h @@ -1,7 +1,7 @@ /* * 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. */ @@ -15,4 +15,6 @@ struct krt_set_params { struct krt_set_status { }; +static inline int krt_set_params_same(struct krt_set_params *o, struct krt_set_params *n) { return 1; } + #endif diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index b321729..110ded0 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -582,6 +582,7 @@ krt_prune(struct krt_proto *p) if (KRT_CF->learn) krt_learn_prune(p); #endif + p->initialized = 1; } 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; else 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->data = p; t->recurrent = KRT_CF->scan_time; - tm_start(t, KRT_CF->scan_time); + tm_start(t, 0); return t; } @@ -735,13 +737,11 @@ krt_start(struct proto *P) #ifdef CONFIG_ALL_TABLES_AT_ONCE if (first) krt_scan_timer = krt_start_timer(p); + else + tm_start(p->scan_timer, 0); 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 p->scan_timer = krt_start_timer(p); - krt_scan(p->scan_timer); #endif return PS_UP; @@ -785,6 +785,19 @@ krt_init(struct proto_config *c) 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 = { name: "Kernel", template: "kernel%d", @@ -794,6 +807,7 @@ struct protocol proto_unix_kernel = { init: krt_init, start: krt_start, shutdown: krt_shutdown, + reconfigure: krt_reconfigure, #ifdef KRT_ALLOW_LEARN dump: krt_dump, dump_attrs: krt_dump_attrs, diff --git a/sysdep/unix/krt.h b/sysdep/unix/krt.h index 85b884a..8a444f0 100644 --- a/sysdep/unix/krt.h +++ b/sysdep/unix/krt.h @@ -62,6 +62,7 @@ struct krt_proto { #ifdef CONFIG_ALL_TABLES_AT_ONCE node instance_node; /* Node in krt instance list */ #endif + int initialized; /* First scan has already been finished */ }; extern struct proto_config *cf_krt; |